[Python-ideas] Async API
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
yield from coro2() # 1
yield from coro2() # 2
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