[Python-Dev] Minimal 'stackless' PEP using generators?
Clark C. Evans
cce at clarkevans.com
Mon Aug 23 17:39:23 CEST 2004
I just read the thread 'Stackless Python' in June 2004 on python-dev and
was wondering if you'd comment on a simpler cooperative mechanism, via a
small hack to generators:
1. The PEP would introduce a new 'builtin' class called 'Cooperate'
2. Generator semantics would be altered so that 'yield X', where X
is an instance of Cooperate, would automagically propigate to
the outer-most non-generator.
In for example,
>>> def MyCooperate(magic.Cooperate):
>>> __str__(self): return "cooperate"
>>> def top():
>>> yield "one"
>>> yield MyCooperate()
>>> yield "two"
>>> def middle():
>>> """ intermediate generator _only_ sees one and two """
>>> for x in top():
>>> print "middle", x
>>> yield x
>>> def lower():
>>> """ this is not a generator, so it sees cooperate """
>>> for x in middle():
>>> print "lower", x
With these two changes, the "lower" function could be an async reactor
like those found in Twisted, or async core. While the result isn't true
coutines, it would be a huge improvement for those who would like to do
async coding. I've done something similar with Twisted called Flow 
and it works well, with the exception of being a painful syntax hack and
being quite slow. If this was moved into Python's core, we'd get most
of the advantages of coroutines without the full cost.
Clark C. Evans Prometheus Research, LLC.
o office: +1.203.777.2550
~/ , mobile: +1.203.444.0557
(( Prometheus Research: Transforming Data Into Knowledge
\/ - Research Exchange Database
/\ - Survey & Assessment Technologies
` \ - Software Tools for Researchers
More information about the Python-Dev