[Twisted-Python] Transmit queue - how would I go at it?
Pablo Martí
pablo at minimoesfuerzo.org
Fri Sep 14 03:37:31 EDT 2007
On Fri, 2007-09-14 at 00:58 -0400, Nadav Aharony wrote:
> Hi,
>
> I am working on an application where clients request files, and since
> each file is very large, the server ACKs the requests and then queues
> them to be served later, one at a time.
> I am relatively new to Twisted and was wondering what would be the
> best way to approach this.
Hi Nadav,
I had a similar requirement with my application. You must offer an
asynchronous interface while dealing with each request synchronously. I
think that you should push your requests to a
twisted.internet.defer.DeferredQueue and process one at a time with the
aid of twisted.internet.defer.DeferredLock.
>
If we consider that each of your petitions has an associated deferred
that will be called back when its finished:
(I haven't run this)
from twisted.internet import defer
class OneAtATime(object):
def __init__(self):
super(OneAtATime, self).__init__()
self.queue = defer.DeferredQueue()
self.lock = defer.DeferredLock()
self.check_queue()
def check_queue(self):
self.queue.get().addCallback(self._process_one)
def _process_one(self, petition):
def acquire_cb(_):
# do whatever with your petition
# make sure that when you're done you call
# self.lock.release() and self.check_queue()
# on a state machine, this would be while transitioning
# to the "idle" state
pass
self.lock.acquire().addCallback(acquire_cb)
def queue_petition(self, petition):
self.queue.put(petition)
return petition.deferred
Regards,
Pablo
>
More information about the Twisted-Python
mailing list