[Twisted-Python] Application mode: Killing a peer connection from the server in a thread. Is this correct?
Glyph Lefkowitz
glyph at twistedmatrix.com
Sun Mar 14 14:27:39 MDT 2010
No. (In answer to the subject.)
On Mar 14, 2010, at 1:24 AM, Jonathan Sawyer wrote:
> Now here's my problem: I want to kill connections from the server that have been idle for, say, 30 seconds. An idle connection is one in which is a _valid_ connection (i.e., it hasn't disconnected from the server) but hasn't sent any data for 30 seconds. The way I have initially set it up was in a thread.
That's your problem. You may not call Twisted APIs of any kind from a thread. That goes *double* for threads started with start_new_thread; if you start threads that way you will have problems with clean shutdown as well. If you have work you want to do in a thread in Twisted, use reactor.callInThread.
http://twistedmatrix.com/documents/10.0.0/api/twisted.internet.interfaces.IReactorThreads.html#callInThread
If, for some reason, you needed to tell a transport to disconnect from a thread, the right way to do it would be to call reactor.callFromThread(transport.loseConnection).
http://twistedmatrix.com/documents/10.0.0/api/twisted.internet.interfaces.IReactorThreads.html#callFromThread
However, this is still wrong, as there's no need to spin up or manage threads in order to run timed events in Twisted.
Bottom line: don't use threads. If you think you need to in order to perform some basic task, there is probably a Twisted API you haven't learned about yet.
> Can anyone direct me on the proper way to kill a connection from the server end in a clean manner?
If you want to check the connection every 30 seconds, use a LoopingCall that calls your 'check' function every 30 seconds, to check the activity flag and call loseConnection if necessary.
http://twistedmatrix.com/documents/10.0.0/api/twisted.internet.task.LoopingCall.html
You should also know that until <http://twistedmatrix.com/trac/ticket/78> is closed, your connection won't be "killed" so much as it is "shut down"; the socket will wait until all of its remaining data has been sent (or the TCP-level timeout has passed) before closing.
More information about the Twisted-Python
mailing list