[Twisted-Python] reactor.callLater() or reactor.callFromThread() when sending msg just before quit
exarkun at twistedmatrix.com
exarkun at twistedmatrix.com
Tue Dec 8 10:14:06 EST 2009
On 12:50 pm, gabriel.rossetti at arimaz.com wrote:
>Hello everyone,
>
>I have to send a message just before my service quits, but sometimes
>the
>reactor quits before the msg is sent.
>I was wondering if I should user reactor.callLater like so :
>
>self.sendMessage(msg)
>reactor.callLater(1, self.stop)
>
>(which I don't really like), or use reactor.callFromThread like so :
>
>self.sendMessage(msg)
>reactor.callFromThread(self.stop)
>
>(self.stop calls reactor.stop at some point).
>
>I really need for that msg to be sent before the reactor shuts down.
You should stop the reactor only after you receive acknowledgement that
the message arrived at its destination. Hopefully the protocol you're
using supports this.
There are several ways in which bytes on a TCP connection can get lost.
When you call reactor.stop() immediately after trying to send some
bytes, it's most likely that they get lost because they are still in
Twisted's send buffer. However, even if they get out of Twisted's send
buffer and into the kernel's, they still may get lost on the network.
And even if they arrive in the destination's kernel receive buffer, the
receiving process may still exit (perhaps unintentionally) without
reading them. And even if it reads them, it may exit without processing
them. And even if they are processed, the disk I/O which records the
result of that processing may be interrupted by a power loss or similar
event.
You may not need to deal with all of these eventualities (it depends on
the purpose and reliability requirements of your application, of
course). It's very common to want to know that the application on the
other side of the connection read and processed the bytes, though. This
requires that the protocol allow messages to be acknowledged.
Jean-Paul
More information about the Twisted-Python
mailing list