[Python-Dev] Simple coroutines?
Phillip J. Eby
pje at telecommunity.com
Thu Aug 26 03:01:47 CEST 2004
At 01:16 PM 8/25/04 -0400, Clark C. Evans wrote:
>On Wed, Aug 25, 2004 at 12:13:46PM -0400, Phillip J. Eby wrote:
>| At 02:51 PM 8/25/04 +1200, Greg Ewing wrote:
>| >> If you could throw a special kind of exception (or even a regular
>| >> exception), and call traceback.resume() to pick up execution at the
>| >> point where it was thrown, whether thrown by a generator or a
>| >> regular function.
>| >
>| >Actually, it probably wouldn't be too hard to make exceptions
>| >resumable -- provided all the frames in between are Python. If the
>| >exception gets thrown through any C calls, though, resumption becomes
>| >impossible. Some other structure is needed to hold the state of a
>| >resumable C call.
>|
>| Unfortunately, as was discussed on the previous Stackless thread, nearly
>| *all* Python bytecodes pass through C on their way to other Python code.
>
>However, the C code in the distribution could be scrubbed to make sure
>that it works with the mechanism. And the C API could be detailed so
>that this case is managable; else, it is an "uncaught" exception.
Quick question: does Stackless' "greenlet" extension module do what you
need? I just built it and played around with it a bit. One of the demos
is a pseudo-generator implementation using a 'Yield' function that uses
greenlet task switching to simulate the behavior of a normal generator
function.
It looks to me that your "yield Cooperate" scenarios could perhaps be met
by simply switching to a reactor/mainloop greenlet, when it's necessary to
wait for an event, and by having your event callback switch back to the
task's greenlet, returning a result if needed.
Interestingly, this greenlet thing looks like it would be perfect for
peak.events, allowing me to get rid of all the generators and yield/resume
stuff. (In fairness, Bob Ippolito told me that before I ever implemented
peak.events, but at the time greenlets didn't exist as an extension module
that could be built outside of Stackless.)
More information about the Python-Dev
mailing list