Thanks, Yury. Have you also considered including recommended setup / cleanup boilerplate in a place where it's easy for asyncio users to find, like in the asyncio docs here? https://docs.python.org/3/library/asyncio-eventloop.html#run-an-event-loop
One example of a Python module using this approach is itertools: https://docs.python.org/3/library/itertools.html#itertools-recipes Currently, even the example snippet provided for loop.shutdown_asyncgens(): https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.shutdown_asyncgens is incomplete because it doesn't execute shutdown_asyncgens() in a try-finally like you do in your latest patch posted on PR #465. Also, even if run() is added to Python 3.7, Python 3.6 users would still need / benefit from being able to find blessed boilerplate in a central place. Thanks, --Chris On Thu, Jul 27, 2017 at 8:40 PM, Yury Selivanov <yseliva...@gmail.com> wrote: > One of the design decisions about `loop.close()` is that it doesn't > do a single event loop iteration, making its behaviour highly predictable. > To make `loop.close()` to run `loop.shutdown_asyncgens()` (which is a > coroutine), we would have needed to change that. > > One of the ways we want to mitigate this problem in Python 3.7 is to > add a new function to bootstrap asyncio and run top-level coroutines: > `asyncio.run()`. You can read more about it here: [1]. > > I'm working on a new PEP that will summarize asyncio changes in 3.7. > I don't have a concrete ETA for it, but I'll try to get the first draft out > by mid September. > > [1] https://github.com/python/asyncio/pull/465 > > Thanks, > Yury > > On Jul 27, 2017, 11:24 PM -0400, Chris Jerdonek <chris.jerdo...@gmail.com>, > wrote: > > I have a question about PEP 525 (Asynchronous Generators) which I'm > sure has a simple answer, but I didn't see it in the PEP or final > discussion: > https://mail.python.org/pipermail/python-dev/2016-September/146265.html > > Basically, why is the API such that loop.shutdown_asyncgens() must be > called manually? For example, why can't it be called automatically as > part of close(), which seems like it would be a friendlier API and > more helpful to the common case? > > I was trying asynchronous iterators in my code and getting the following > error: > > Exception ignored in: <generator object Queue.get at 0x7f950a667678 > Traceback (most recent call last): > File "/usr/local/lib/python3.6/asyncio/queues.py", line 169, in get > getter.cancel() # Just in case getter is not done yet. > File "/usr/local/lib/python3.6/asyncio/base_events.py", line > 574, in call_soon > self._check_closed() > File "/usr/local/lib/python3.6/asyncio/base_events.py", line > 357, in _check_closed > raise RuntimeError('Event loop is closed') > RuntimeError: Event loop is closed > > Calling loop.shutdown_asyncgens() made the error go away, but it seems > a little obscure that by adding an asynchronous iterator somewhere in > your code, you have to remember to check that that line is present > before loop.close() is called (and the exception message doesn't > provide a good hint). > > Is there any disadvantage to always calling loop.shutdown_asyncgens() > (i.e. even if it's not needed)? And why might someone need to call it > at a different time? > > Thanks, > --Chris > _______________________________________________ > 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/ > >
_______________________________________________ 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/