[Python-ideas] Async API

Yury Selivanov yselivanov.ml at gmail.com
Sun Oct 28 08:03:34 CET 2012

On 2012-10-28, at 1:55 AM, Greg Ewing <greg.ewing at canterbury.ac.nz> wrote:

> Yury Selivanov wrote:
>> In the above example scheduler *can* safely interrupt "c2" when it
>> is invoked from "c1" at "p2".  I.e. scheduler can't interrupt the
>> coroutine when it is itself in its finally statement, but it's fine
>> to interrupt it when it is not, even if it is invoked from other
>> coroutine's finally block.
> I'm confused about the relationship between c1 and c2 here, and
> what you mean by one coroutine "invoking" another.
> Can you post a version that uses yield-from instead of yielding
> objects with unknown (to me) semantics?

The reason I kept using my version is because I'm not sure how we will set 
timeouts for yield-from style coroutines.  But let's assume that we can do 
that with a context manager.

Let's also assume that generator object has 'in_finally()' method,
as you defined: "Something like an in_finally() method that looks along 
the yield-from chain and returns true if any of the generators are in a 
finally section."

    def coro1():
            with timeout(1.0):
                yield from coro2() # 1
                with timeout(1.0):
                    yield from coro2() # 2
            except TimeoutError:

    def coro2():
            yield # 3
            yield # 4

Now, if "coro2" is suspended at #4 -- it shouldn't be interrupted with

If, however, "coro2" is at #3 -- it can be, and it doesn't matter was it 
called from #1 or #2.

IIUC, yield-from supporting scheduler, won't know about "coro2".  All it 
will have is a generator for "coro1".  All dispatching will be handled
by "yield from" statement automatically.  In this case, you can't rely
on "coro1.in_finally()", because it will return:

- True, when "coro1" is at #1 & "coro2" is at #4 (it's unsafe to interrupt)
- True, when "coro1" is at #2 & "coro2" is at #3 (safe to interrupt)

The fundamental problem here, is that scheduler knows nothing about
coroutines call chain.  It doesn't even know at what generator 
'with timeout' was called.


More information about the Python-ideas mailing list