I realize I'm probably just dumb and missing something big and important, but I can't figure out how to specify a timeout in twisted using reactor.listenUDP. My goal is to be able to specify a timeout, and after said amount of time, if DatagramProtocol.datagramReceived has not been executed, have it execute a callback or something that I can use to call reactor.stop(). Any help or advice is appreciated. Thanks
-
Since Twisted is event driven, you don't need a timeout per se. You simply need to set a state variable (like datagramRecieved) when you receive a datagram and register a looping call that checks the state variable, stops the reactor if appropriate then clears state variable:
from twisted.internet import task from twisted.internet import reactor datagramRecieved = False timeout = 1.0 # One second # UDP code here def testTimeout(): global datagramRecieved if not datagramRecieved: reactor.stop() datagramRecieved = False l = task.LoopingCall(testTimeout) l.start(timeout) # call every second # l.stop() will stop the looping calls reactor.run()From Aaron Maenpaa -
I think reactor.callLater would work better than LoopingCall. Something like this:
class Protocol(DatagramProtocol): def __init__(self, timeout): self.timeout = timeoutdef datagramReceived(self, datagram): self.timeout.cancel() # ...timeout = reactor.callLater(5, timedOut) reactor.listenUDP(Protocol(timeout))
From daf
0 comments:
Post a Comment