[Twisted-Python] reactor.addSystemEventTrigger("before", "shutdown", self.logout)

Manlio Perillo manlio_perillo at libero.it
Fri Apr 14 16:34:23 MDT 2006


Jean-Paul Calderone ha scritto:
> On Fri, 14 Apr 2006 17:15:25 -0200, Manlio Perillo
> <manlio_perillo at libero.it> wrote:
>> Hi.
>>
>> I would like to have a function be called at the very end of the reactor
>> lifetime.
>>
>> I have tried with the statement in the subject, where self.logout sends
>> a packet via UDP (self is an instance of a class derived from
>> DatagramProtocol).
>>
> 
> Services or the underlying APIs they rely on (addSystemEventTrigger) are
> the correct way to go about this.
> 

Ok.

>> But this seems to be not allowed.
>> I obtain:
>>
> [...]
>>
>> This means, in short, that in a shutdown event I can't use the reactor?
>> I think that this should be documented.
>>
> 
> You can, and many applications do.  Perhaps you have found a bug, or
> perhaps you are using system event triggers improperly. Could you post
> a minimal, complete example which will reproduce this behavior?
> 

Sure!
My system is Windows XP SP2, Python 2.4.3, Twisted 2.2.0


##########
import sys

from twisted.python import log

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import defer, reactor


class Server(DatagramProtocol):
    def datagramReceived(self, data, addr):
        print "server: received from %s:%d" % addr, data
        self.transport.write("LOGGED OUT", addr)


class Client(DatagramProtocol):
    def __init__(self):
        self.deferred = defer.Deferred()

    def startProtocol(self):
        self.transport.connect("127.0.0.1", 9000)

        reactor.addSystemEventTrigger("before", "shutdown", self.logout)

    def connectionRefused(self):
        print "unable to connect"

    def datagramReceived(self, data, addr):
        print "client: received from %s:%d" % addr, data
        self.deferred.callback(data)

    def logout(self):
        self.transport.write("LOGOUT")

        return self.deferred



reactor.listenUDP(9000, Server())
reactor.listenUDP(0, Client())

reactor.callLater(2, reactor.stop)

log.startLogging(sys.stdout)
reactor.run()

#############



The problem seems to be with the response.
There are no problems if logout does not return a deferred (but in this
case the client does not sees the LOGGED OUT response).


Is this an improper use of system event triggers?



Thanks and regards  Manlio Perillo




More information about the Twisted-Python mailing list