[Python-Dev] Simple coroutines?
Greg Ewing
greg at cosc.canterbury.ac.nz
Wed Aug 25 04:51:22 CEST 2004
"Phillip J. Eby" <pje at telecommunity.com>:
> 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.
I agree that maintaining a stack of *ators automatically somehow
would be desirable, but I haven't figured out yet exactly where
and how that stack would be maintained.
> What's really needed (IMO) is to add a way to communicate *into* a
> co-operator, passing it a value to "accept" or a traceback to raise.
> E.g.:
>
> input = suspend output
There have been many suggestions in the past for 'yield' to be
extended to allow values to be passed in as well as out. They all
suffer from a problem of asymmetry. However you arrange it, you always
end up having to discard the first value passed out or pass a dummy
value in the first time, or something like that. I deliberately left
communication out of the suspend to avoid those problems. If you want
communication, you have to arrange it some other way.
> Anyway, as I said, what would be *most* useful for async programming is a
> way to resume a traceback, because then you wouldn't need for every
> intervening frame to have special suspension capability.
Certainly, but that way, ultimately, lies Stackless...
Greg Ewing, Computer Science Dept, +--------------------------------------+
University of Canterbury, | A citizen of NewZealandCorp, a |
Christchurch, New Zealand | wholly-owned subsidiary of USA Inc. |
greg at cosc.canterbury.ac.nz +--------------------------------------+
More information about the Python-Dev
mailing list