[Python-Dev] PEP 334 - Simple Coroutines via SuspendIteration

Samuele Pedroni pedronis at bluewin.ch
Wed Sep 8 20:58:21 CEST 2004


James Y Knight wrote:
> 
> On Sep 7, 2004, at 9:48 PM, Clark C. Evans wrote:
> 
>> I've packaged up the idea of a coroutine facility using iterators and an
>> exception, SuspendIteration.
> 
> 
> Very interesting.
> 
>> This proposal assumes that a corresponding iterator written using
>> this class-based method is possible for existing generators.  The
>> challenge seems to be the identification of distinct states within
>> the generator where suspension could occur.
> 
> 
> That is basically impossible. Essentially *every* operation could 
> possibly raise SuspendIteration, because essentially every operation can 
> call an arbitrary python function, and python functions can raise any 
> exception they want. I think you could still make the proposal work in 
> CPython: if I understand its internals properly, it doesn't need to do a 
> transformation to a class iterator, it simply suspends the frame 
> wherever it is. Thus, being able to suspend at any point in the function 
> would not cause an undue performance degradation.

I don't think it is that simple for CPython either, a single bytecode 
can potentially invoke more then just a single builtin or other python 
code, e.g. calling construction can invoke __new__ and __init__,
and then there are all the cases were descriptors are involved with 
their __get__ etc (and __add__,__radd__...). So bytecodes are not the 
right suspension/resumption granularity because you don't want to 
reinvoke things that could have had side-effects.
So you have all the points per bytecode were python code/builtins can be 
invoked or from another POV an exception can be detected.

If I understand the proposal (which is quite vague), like restartable 
syscalls, there is also the matter that whatever raised the 
SuspendIteration should be retried on resumption of the generator, e.g 
calling nested generator next.

So one would have to cherry pick for each bytecode or similar abstract
operations model relevant suspension/resumption points and it would 
still be quite a daunting task to implement this adding the code
for intra bytecode resumption. (Of course this assumes that capturing
the C stack and similar techniques are out of question)

> 
> However, I think it is a deal-breaker for JPython. From the generator 
> PEP: "It's also believed that efficient implementation in Jython 
> requires that the compiler be able to determine potential suspension 
> points at compile-time, and a new keyword makes that easy." If this 
> quote is right about the implementation of Jython (and it seems likely, 
> given the JVM), your proposal makes it impossible to implement 
> generators in Jython.

a hand coded implementation would be a *lot* of work (beyound practical)
for potentially very bad performance and a resulting messy codebase.
One could also encounter resulting code size problems or issues with the 
verifier.




More information about the Python-Dev mailing list