[Twisted-Python] reset/restart reactor problem

Jean-Paul Calderone exarkun at divmod.com
Sat Jun 24 23:47:47 EDT 2006


On Sun, 25 Jun 2006 04:19:22 +0100, Joseph Newman <jfn20 at cam.ac.uk> wrote:
>Hi All,
>
>I am porting an academic middleware project, currently implemented in  C++ 
>and Java, to python. It extensively uses multicast for  communicating 
>general events and TCP to communicate with a database.  The multicast 
>messages that I send out depend on the results that I  first obtain from the 
>database. I would prefer to serialise each of  these requests in turn, but 
>its not immediately obvious to me what  the best way to do this using 
>Twisted is.

There are quite a few possible techniques to apply here.  One I would
recommend is to keep a list of objects which represent pending tasks
which need to be executed serially.  When each task completes, pop the
next one from the list and begin processing it.  When a new task needs
to be performed, push it onto the list.

>
>If I could reset the reactor after each client/server transaction  that 
>would be by far the easiest.

Twisted does not currently support restartable reactors.  This may be
addressed someday, but I don't think this is actually the best solution
to the problem you are facing.

>I have been experimenting with 
>threadedselectreactor, but I currently don't have an event loop as  such 
>that is independent of the reactor event loop. Nearly all the  examples deal 
>with processes that either act as servers or clients,  rather than 
>combinations of the two.

TSR probably isn't helpful here.  I would suggest something like this:

  class JobList:
      def __init__(self):
          self.jobs = []

      def add(self, job):
          self.jobs.append(job)
          if len(self.jobs) == 1:
              self._doJob()

      def _doJob(self):
          job = self.jobs[0]
          d = job.do()
          d.addErrback(log.err)
          d.addCallback(self._finishedJob)

      def _finishedJob(self, result):
          self.jobs.pop(0)
          if self.jobs:
              self._doJob()

Hope this helps,

Jean-Paul




More information about the Twisted-Python mailing list