[Twisted-Python] How to dispatch message to different servers

Laurens Van Houtven _ at lvh.cc
Sat Mar 2 04:08:41 EST 2013


Yes, that looks okay, but that wasn't in your original sample ;-)

I'm on my phone at the moment which isn't great for code review, but it
looks like you only fire one deferred per line?
On Mar 2, 2013 9:50 AM, "Benjamin BERTRAND" <beenje at gmail.com> wrote:

>
> Le 2 mars 2013 à 04:34, exarkun at twistedmatrix.com a écrit :
>
> > On 1 Mar, 09:52 pm, beenje at gmail.com wrote:
> >> Thanks for the answer!
> >>
> >> I was hoping to avoid having to put something like AMP in place,
> >> because it looked a bit overkill for my case.
> >> I think I actually found a way :-)
> >
> > Unfortunately, it looks like the code that you shared will only work
> > accidentally (if at all).  You cannot use Twisted APIs except in the
> > reactor thread.  You will at least need to add in some code to send data
> > back to the reactor thread before you use Twisted APIs (such as
> > `Deferred.callback`).
>
>
> In run_pcap, I call reactor.callFromThread(callback, x25_data, line_id).
> See below.
> That seems to work with the tests I did.
> Am I missing something?
>
> /Benjamin
>
> def run_pcap(device, pcap_filter, callback):
>
>     def analyse_packet(hdr, data):
>         # check the data
>         reactor.callFromThread(callback, x25_data, line_id)
>
>     p = pcapy.open_live(device, 65535, 1, 100)
>     p.setfilter(pcap_filter)
>     p.loop(-1, analyse_packet)
>
>
> class Oldimon(Protocol):
>
>     def __init__(self, factory):
>         self.factory = factory
>         self.line = None
>
>     def connectionMade(self):
>         # Check the server port to get the line
>         # associated to this protocol
>         port = self.transport.getHost().port
>         self.line = LINES_PORT[port]
>         # Add the callback for this line
>         self.factory.deferred[self.line] = defer.Deferred()
>         self.factory.deferred[self.line].addCallback(self.messageToSend)
>
>
> class OldimonFactory(ServerFactory):
>
>     def __init__(self, device, pcap_filter):
>         # pcapDataReceived callback is called everytime a message
>         # is received
>         reactor.callInThread(run_pcap, device, pcap_filter,
> self.pcapDataReceived)
>         # Dict with a deferred for each line
>         self.deferred = dict(zip(LINES_PORT.values(), [None] *
> len(LINES_PORT)))
>
>     def buildProtocol(self, addr):
>         return Oldimon(self)
>
>     def pcapDataReceived(self, data, line):
>         if self.deferred[line] is not None:
>             # Fire the callback for line
>             d, self.deferred[line] = self.deferred[line], None
>             d.callback(data)
>
> oldimon_factory = OldimonFactory(device, pcap_filter)
> for port in LINES_PORT.keys():
>     reactor.listenTCP(port, oldimon_factory)
> reactor.run()
>
>
> >
> > Jean-Paul
> >
> > _______________________________________________
> > Twisted-Python mailing list
> > Twisted-Python at twistedmatrix.com
> > http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://twistedmatrix.com/pipermail/twisted-python/attachments/20130302/aeb246f7/attachment-0001.htm 


More information about the Twisted-Python mailing list