[Twisted-Python] LineReceiver Protocol

Eric Mangold teratorn at world-net.net
Sun Nov 21 15:49:13 MST 2004


> Christopher Armstrong wrote:
>> On Sat, 20 Nov 2004 23:12:18 -0800, Michael Mata
>> <michael.mata at gaigen.net> wrote:
>>
>>>Is there a way to extend the LineReceiver protocol to take action on a
>>>continued, periodic basis?  Currently, the protocol only does work when
>>>a line is received.  However, there are times when the script should
>>>take action without waiting to receive a line.
>>
>>
>> It doesn't have anything to do with the protocol; what you want is
>> reactor.callLater(seconds, functionToCall)
>>
>> http://twistedmatrix.com/documents/current/howto/time has more
>> information.
>>
>>
>>>Another example might be a global message that needs to be sent to all
>>>connections.  The message would have to be stored in  message queue and
>>>sent only when lineReceived is called.  It would be nice if the message
>>>could instead be sent imediately even if the connection was currently
>>> idle.
>>
>>
>> For this you just want to keep track of all the protocols you want to
>> send stuff to. doc/examples/chatserver.py shows how to do this.
>> basically, in your lineReceived, you can do something like "for prot
>> in self.factory.protocols: prot.sendMessage(line)".
>>
>>
>
> The function task.LoopingCall(runEverySecond) from twisted.internet
> looks like a good fit for scheduling recurring maintenance.
>
> If I follow chatserver.py, data globally available to all protocols
> should be stored in the reactor.

No, the reactor is pretty much off-limits for storing user data :)
You should store such information in your client Factory.
You can use the Factory's buildProtocol method to do per-protocol
record keeping.

>  I'm guessing that if I want data
> associated to a specific instance of a protocol, I should store it in a
> variable under the protocol's __init__ function.

Sure, that's fine, and you can pass state in to your Protocol instances
when you build them from your Factory's buildProtocol.

> For example, I'd give a protocol a session id upon connection and add it
> to the client list in the reactor.  Now if I want to send a message to
> that client, I'd iterate throught the list in the reactor until I find
> the one with correct session id.

Sure, except s/reactor/Factory/

-Eric




More information about the Twisted-Python mailing list