At both PyCon 2011 and EuroPython 2010, I was somewhat surprised by the 
popularity of greenlet based solutions (eventlet, gevent). This is despite the 
fact that a Stackless Python based solution ought to outperform the 
aforementioned.

During PyCon 2011, there were two discussions of particular interest. The first 
was with Christian Tismer about what makes stackless "stackless" and when does 
hard switching occur. This is important since soft switching is ten times 
faster than hard switching. 

Of interest to me is how many times in the typically networking scenario does 
hard switches occur? And maybe alter Stackless to occur these cases.

The second talk was with the Twisted team. The subject of a Stackless Twisted 
Reactor was mentioned and I was told, "why bother - eventlets has Twisted 
support!" From what I have seen, Twisted support is in the form of blockOns, a 
technique used by Christopher Armstrong. I use blockOns.

BlockOn is a very effective technique. The bulk of my talk, "Adventures in 
Stackless Python / Twisted Integration" deal with handling what for now are 
rather obscure edge cases where dead lock would occur. Since that talk,
I have been interested in making tasklets and callbacks work together more 
naturally. In part I believe callbacks become unnecessary.

Now this echos back to a conversation I had at EuroPython 2010. Things boiled 
down to "why do you need a scheduler?" Well in the case of both gevent and 
twisted, there is a still a "scheduler" that is essentially non pre-emptive and 
can only schedule I/O bound "tasks." However this may be good enough for most 
people's needs. 

The Twisted conversation ended with me sitting with the Twisted team and 
learning the basics of writing a custom reactor. Glyph and J.P kindly pointed 
out the pit-falls.

The plan:

Using stackless.py as a test bed, I would write a Stackless Reactor. However 
instead of using CPython with greenlets. I would use PyPy-c which to the best 
of my knowledge is solely soft-switching. I would replace the stackless.run() 
with a new stackless.run that would be a modified Twisted reactor. Of course 
tasklets would not know the difference.

Amongst the things I would do, is replace the blockOn, with a lighter "channel" 
class that could transfer data into the tasklet and schedule it. Also 
appropriate Twisted class methods could be transparently called, i.e. 
client.getPage(). 

And to cover edge cases, protocol instances would run in a tasklet (after all I 
want to build stuff that I can use for my own work).

I have a few more ideas but this all for now. Comments?

Cheers,
Andrew





      

_______________________________________________
Stackless mailing list
[email protected]
http://www.stackless.com/mailman/listinfo/stackless

Reply via email to