[Python-Dev] Twisted Isn't Specific (was Re: Trial balloon: microthreads library in stdlib) (original) (raw)

Dave Cole djc at object-craft.com.au
Thu Feb 15 06:20:27 CET 2007


Phillip J. Eby wrote:

At 04:25 PM 2/15/2007 +1300, Greg Ewing wrote:

Phillip J. Eby wrote:

peak.events, for example, lets you have multiple event loops running in the same or different threads. Different threads is okay if you're willing to use threads, but you might not. The reason you're using an event loop may well be precisely so that you don't have to use threads.

And... how do you run multiple event loops simultaneously in the same thread? When one is nested inside the other. This isn't a common need, but it's occasionally useful if you need to switch back and forth between blocking and non-blocking code. For example, suppose that you have some code that wants to offer a synchronous interface to an asynchronous library... and the synchronous code is being called from a FastCGI "accept" event loop. The inner code can't use the outer event loop, because the outer loop isn't going to proceed until the inner code is finished.

I actually have some code that works a little bit like this.

I have a SelectLoop class that the application knows about and explicitly attaches transport objects to, and queues events on the loop. I have two ways to perform some actions in a "blocking" way.

  1. I can create a new SelectLoop and move some transports temporarily from the main loop to the temporary loop to ignore all other events for a while.

  2. I can re-enter the SelectLoop run() method and keep reacting to all events. Once the right event occurs - I exit from the nested run() and continue on. This does require a lot more mental effort though.

Note that my code is nowhere near as ambitious as Twisted, but I watned to have the above flexibility. The code really only has to work on AIX and Linux, and in a limited way, Windows.



More information about the Python-Dev mailing list