> On Mar 26, 2019, at 11:56 AM, Yury Selivanov <yseliva...@gmail.com> wrote:
> 
> 
>> On Mar 25, 2019, at 8:01 PM, Guido van Rossum <gu...@python.org 
>> <mailto:gu...@python.org>> wrote:
>> 
>> Given PBP, I wonder if we should just relent and have a configurable flag 
>> (off by default) to allow nested loop invocations (both the same loop and a 
>> different loop).
>> 
> 
> 
> I think that if we implement this feature behind a flag then some libraries 
> will start requiring that flag to be set.  Which will inevitably lead us to a 
> situation where it's impossible to use asyncio without the flag.  Therefore I 
> suppose we should either just implement this behaviour by default or defer 
> this to 3.9 or later.

How do you feel about my proposal of making the "flag" be simply an argument to 
run_until_complete?  If what you really want to do is start a task or await a 
future, you should get notified that you're reentrantly blocking; but if you're 
sure, just pass the arg and be on your way.

If it's a "flag" like an env var or some kind of global switch, then I totally 
agree with you.

> I myself am -1 on making 'run_until_complete()' reentrant.  The separation of 
> async/await code and blocking code is painful enough to some people, 
> introducing another "hybrid" mode will ultimately do more damage than good.  
> E.g. it's hard to reason about this even for me: I simply don't know if I can 
> make uvloop (or asyncio) fully reentrant.

If uvloop has problems with global state that prevent reentrancy, fine - for 
the use-cases where you're doing this, you already kind of implicitly don't 
care about performance; someone can instantiate their own, safe loop.  (If you 
can't do this with asyncio though I kinda wonder what's going on.)

> In case of Jupyter I don't think it's a good idea for them to advertise 
> nest_asyncio.  IMHO the right approach would be to encourage library 
> developers to expose async/await APIs and teach Jupyter users to "await" on 
> async code directly.

✨💖✨

> The linked Jupyter issue (https://github.com/jupyter/notebook/issues/3397 
> <https://github.com/jupyter/notebook/issues/3397>) is a good example: someone 
> tries to call "asyncio.get_event_loop().run_until_complete(foo())" and the 
> call fails.  Instead of recommending to use "nest_asyncio", Jupyter REPL 
> could simply catch the error and suggest the user to await "foo()".  We can 
> make that slightly easier by changing the exception type from RuntimeError to 
> NestedAsyncioLoopError.  In other words, in the Jupyters case, I think it's a 
> UI/UX problem, not an asyncio problem.

So, you may not be able to `await` right now, today, from a cell, given that 
that needs some additional support.  But you can create_task just fine, right?  
Making await-with-no-indentation work seamlessly would be beautiful but I don't 
think we need to wait for that modification to get made in order to enjoy the 
benefits of proper asynchrony.

-g

_______________________________________________
Async-sig mailing list
Async-sig@python.org
https://mail.python.org/mailman/listinfo/async-sig
Code of Conduct: https://www.python.org/psf/codeofconduct/

Reply via email to