[Twisted-Python] [Twisted-web] Telnet chat server
glyph at divmod.com
glyph at divmod.com
Wed Jun 3 22:51:10 MDT 2009
This message is more appropriate for the twisted-python list, as it has
nothing to do with "web", so I've cross-posted it there.
On 3 Jun, 10:57 pm, woahyeahyeah at yahoo.com wrote:
>I've got a simple little chat server set up that people can telnet
>into. The code is as follows:
>from twisted.internet import reactor
>from twisted.internet.protocol import ServerFactory
>from twisted.protocols.basic import LineOnlyReceiver
>import threading
^ This is where things start to go (horribly) wrong.
The protocol looks basically correct, but this part:
>def Test():
> global test
> factory.sendMessageToAllClients('Hey.')
> test = threading.Timer(1.0,
>Test)
> test.start()
>test = threading.Timer(1.0, Test)
>test.start()
is very, very wrong. You cannot call Twisted APIs from a thread. Ever.
This is very important :). The behavior to you appeared to be some
strange timing issues, but you can get anything from corrupted data to
crashing the entire program.
>Is there any way to get this to send the message and have it show up
>for a client even when they're idle?
Yes. Use the reactor's timed-event APIs rather than threads. In other
words, do this, after you create your factory:
from twisted.internet.task import LoopingCall
LoopingCall(factory.sendMessageToAllClients, 'Hey.').start(1.0)
You may be interested to also read about these APIs:
http://twistedmatrix.com/documents/8.2.0/api/twisted.internet.task.LoopingCall.html
http://twistedmatrix.com/documents/8.2.0/api/twisted.internet.interfaces.IReactorTime.html
More information about the Twisted-Python
mailing list