[Python-Dev] Simple coroutines? (original) (raw)

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