The nice thing about using Python's process support is that you can
spawn native Processes that run in separate heaps directly from ONE
Python Twisted app. Not many running side-by-side, which adds the
complexity of now coordinating among them (however easy with additional
protocols like spread).

Inter-Process communication is also supported in Python's new
multiprocessing package. And again, it can all be orchestrated from a
single service _instance_.

In my code, I need to run "on the metal" for some tasks and not others.
Agreed, the event-based reactor threading in Twisted is great.
But not for all modes of computation. For those, I offload onto OS
processes directly onto CPU cores. Twisted does not provide a way to
leverage its API against Python's support for this feature. So I have to
find a way to marry the two.

What I ended up doing was using the multiprocess package to kick off
hard Process objects in a Python Process pool executing Python
functions.

Those functions make calls into Twisted, but for it to work, they had to
start their own reactors because a Process has its own, separate OS
memory, etc. Running compute intensive tasks in processes with their own
memory makes a lot of sense for some things that Python cannot do with
virtual machine thread contexts.

Darren

On Thu, 2010-02-25 at 10:21 -0800, K. Richard Pixley wrote:

> Single threaded, event loop based code like twisted rocks hard.
> 
> Once upon a time, threads were like that too and the distinction
> between threads and event loops was grey.  But with the advent of
> mandatory preemptive thread scheduling and the ability to run multiple
> threads on separate shared memory processors, the difference between
> programming with threads and programming with parallel heavy weight
> processes that share memory became extremely grey, (aside from the
> problems debugging threads which don't exist for heavy weight
> processes).
> 
> Threads routinely use shared memory and shared memory (generally)
> requires a common kernel.  OTOH, message passing can use a common
> kernel but can also extend out to other machines on the network.  If
> you use twisted for highly efficient "single thread/multiple task"
> heavy weight processes, and something like spread, you end up with the
> best of all worlds.  Highly efficient, symmetric, network based
> parallelism, with fault tolerance thrown in for free.
> 
> My point here is that there are other ways to go about exploiting
> symmetric multiprocessor machines, even banks of them, that neither
> require threads, nor the multiprocessing package.
> 
> --rich
> 
> Darren Govoni wrote: 
> 
> > Looks interesting. I'm going to check out that package.
> > 
> > 
> > My original request was more along the lines of using Python's new
> > support for native CPU core's and processes (the multiprocessing
> > package is for this). Python's built-in thread support has global
> > lock constraints that underperform in some situations.
> > 
> > But I ran into a problem using multiprocessing module with Twisted
> > that was pointed out on the Twisted trac with pickling class methods
> > and apparently Python's CPU threading support attempts to do this in
> > some situations (e.g. when I try to pass a class method to a native
> > thread).
> > 
> > On Wed, 2010-02-24 at 12:04 -0800, K. Richard Pixley wrote:
> > 
> > > Glyph Lefkowitz wrote: 
> > > 
> > > > On Feb 21, 2010, at 8:00 PM, Alexandre Quessy wrote
> > > >       
> > > > 
> > > > > Hello everyone,
> > > > > I have done something similar to this, but I used the children IO
> > > > > stream to control them. Maybe I should have done that using some
> > > > > higher level protocol, such as AMP or PB.
> > > > >     
> > > > >         
> > > > 
> > > > Using a higher-level protocol is generally better, if for no other 
> > > > reason that it gives you a framework within which to document your 
> > > > design decisions.  It's much easier to say "An AMP command with a 'foo' 
> > > > String argument and a 'bar' Integer argument" than to say "The first 
> > > > two bytes of the message are the length of the first argument.  The 
> > > > next n bytes are the first argument.  The first argument shall be 
> > > > interpreted as... (etc, etc)"
> > > >       
> > > 
> > > I'm working on an interface right now to the spread toolkit,
> > > (http://spread.org), which implements virtual synchrony,
> > > (http://en.wikipedia.org/wiki/Virtual_synchrony).
> > > 
> > > For distributed, symmetric, fault tolerant parallelism in small to
> > > medium scale with high reliability, this might be an option.
> > > 
> > > --rich 
> > > 
> > > _______________________________________________
> > > Twisted-Python mailing list
> > > Twisted-Python@twistedmatrix.com
> > > http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
> > >     
> > 
> > 
> > 
> > 
> > ____________________________________________________________________
> > 
> > _______________________________________________
> > Twisted-Python mailing list
> > Twisted-Python@twistedmatrix.com
> > http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
> >   
> 
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python@twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python


_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to