[Twisted-web] Custom __del__ not run

Jp Calderone exarkun at divmod.com
Tue Jul 26 06:39:07 MDT 2005


On Tue, 26 Jul 2005 19:49:27 +1000, Rasjid Wilcox <rasjidw at openminddev.net> wrote:
>Hello again.
>
>I have my xmlrpc class that I am running in twisted.  I want it to do some
>cleaning up when it is finished, and so I have defined a custom __del__
>procedure.

"Finished"?  "__del__" isn't a "finished" callback.  It's a garbage collection  callback.

>
>However, when mixed with a looping call, it never gets called.  Sample code
>below.  Remove the two lines starting with self.looping, and it all works as
>expected.  Put them in, and the custom __del__ is not called.

You created a strong, permanent reference to your instance.  Now it will never be garbage collected.  So there's no reason for __del__ to ever be called.

>
>Is this a bug in twisted?  Or have I broken some twisted rule about using
>__del__ procedures?  Is there some other way of saying 'when you have stopped
>the reactor, do foo', that twisted would be happy with?
>

If you want to run something when the reactor stops, you either want to use a server or a system event trigger:

    from twisted.application import service

    class SomeService(service.Service):
        def stopService(self):
            print 'bye bye'

    # Having a reference to theApplicationOrAnotherService is left 
    # as an exercise for the reader
    SomeService().setServiceParent(theApplicationOrAnotherService) 

Alternatively

    from twisted.internet import reactor

    class MyThing:
        def __init__(self):
            reactor.addSystemEventTrigger('before', 'shutdown', self.stop)

        def stop(self):
            print 'bye bye'

    th = MyThing()

In general, don't use __del__.  It doesn't do what you want.

Jp



More information about the Twisted-web mailing list