[Twisted-Python] Using reactor with multiple processes

Phil Mayers p.mayers at imperial.ac.uk
Wed Sep 16 10:02:00 EDT 2009


Dimitri Vorona wrote:
> Hi,
> 
> i'd like to be able to start additional instances of my server using
> multiprocess module. To do it i just start a new Process with
> mutiprocessing and then create a new instance of my Application there.
> Everything works fine, but i can't figure out a way to
> stop such a process. If I run reactor.stop() in the child process I
> get an infinite loop of errors looking like this:
> 
>    --- <exception caught here> ---
>  File "/usr/share/exe/twisted/internet/tcp.py", line 755, in doRead
>    skt, addr = self.socket.accept()
>  File "/usr/lib/python2.6/socket.py", line 195, in accept
>    sock, addr = self._sock.accept()
> <class 'socket.error'>: [Errno 22] Invalid argument
> 
>  I couldn't not find much information on using reactor from different
> processes, so i'm asking for help here.

I doubt this will work.

When are you starting the multiprocess children?

If it's after the main reactor has started, then you'll run into all 
kinds of problems. When I last looked into it, multiprocess just calls 
"fork()" and then carries on going - it doesn't re-exec the python 
interpreter, so the child process and parent process share state, 
including open file descriptors and such - closing the child process 
will cause "damage" to file descriptors in the parent, amongst other things.

Aside from all that, multiprocess is blocking so doesn't play well with 
Twisted.

You should look into something like Ampoule:

https://launchpad.net/ampoule

...which will work "correctly" with Twisted.



More information about the Twisted-Python mailing list