[Python-Dev] PEP 380 (yield from a subgenerator) comments
Stefan Rank
list-ener at strank.info
Fri Mar 27 11:53:31 CET 2009
on 2009-03-27 05:17 P.J. Eby said the following:
> At 04:08 PM 3/27/2009 +1300, Greg Ewing wrote:
>> You can't expect to improve something like that by
>> stuffing yield-from into the existing framework, because
>> the point of yield-from is to render the framework
>> itself unnecessary.
>
> But it doesn't. You still need *something* that processes the yielded
> values, since practical frameworks have various things to yield "to" -
> i/o, time, mouse clicks, whatever. Correctly dealing with the call
> stack part is tedious to implement, sure, but it's not really the focal
> point of a microthreading framework.
I can chime in here with a use case, if an unusual one. I implemented
just such a framework based on generator syntax for my thesis work to
model the behaviour of software agents as a collection of interacting
activities (microprocesses). The top layer is based on Twisted (similar
to its _inlineCallbacks) and different schedulers decide on what to do
with yielded values.
This is really very similar to Philip Eby's code, the main difference
being that one uses a generic function yield_to as an extension point
and the other one uses (subclasses of) Deferreds.
You can handle the call stack in the Deferred-based case just as
clumsily as in the other :-).
And in my system, the "call stack" (i.e. the hierarchy of active
microprocesses) and how it can be manipulated by the agent is actually
the interesting part.
> Usually, you need to have some way to control which microthreads are
> actually to be executing, vs. the ones that are waiting for a particular
> time, an I/O operation, or some other sort of event. None of that stuff
> goes away just by taking care of the call stack.
Yes. However, the valuable addition that an explicit yield from syntax
would provide for my use case is a way to explicitly distinguish between
subgenerators just for the sake of refactoring code vs. sub-"processes".
I could remove quite some duplication from my current code.
Additionally, as noted in the PEP, it would open the path for
optimisations of the refactoring cases.
I also think that a separation of handling the generator call stack and
handling yielded values improves the situation for scheduling/trampoline
authors conceptually.
Just my 0.02€
cheers,
stefan
More information about the Python-Dev
mailing list