diff options
author | Yury Selivanov <yury@magic.io> | 2017-12-14 14:42:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-14 14:42:21 (GMT) |
commit | 02a0a19206da6902c3855a1fa09e60b208474cfa (patch) | |
tree | df9a24bf2a131693ef4f3dad55849c22a1567991 /Lib/asyncio | |
parent | eadad1b97f64619bfd246b9d3b60d25f456e0592 (diff) | |
download | cpython-02a0a19206da6902c3855a1fa09e60b208474cfa.zip cpython-02a0a19206da6902c3855a1fa09e60b208474cfa.tar.gz cpython-02a0a19206da6902c3855a1fa09e60b208474cfa.tar.bz2 |
bpo-32314: Implement asyncio.run() (#4852)
Diffstat (limited to 'Lib/asyncio')
-rw-r--r-- | Lib/asyncio/__init__.py | 2 | ||||
-rw-r--r-- | Lib/asyncio/runners.py | 48 |
2 files changed, 50 insertions, 0 deletions
diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py index dd6686d..23ea055 100644 --- a/Lib/asyncio/__init__.py +++ b/Lib/asyncio/__init__.py @@ -11,6 +11,7 @@ from .events import * from .futures import * from .locks import * from .protocols import * +from .runners import * from .queues import * from .streams import * from .subprocess import * @@ -23,6 +24,7 @@ __all__ = (base_events.__all__ + futures.__all__ + locks.__all__ + protocols.__all__ + + runners.__all__ + queues.__all__ + streams.__all__ + subprocess.__all__ + diff --git a/Lib/asyncio/runners.py b/Lib/asyncio/runners.py new file mode 100644 index 0000000..94d9409 --- /dev/null +++ b/Lib/asyncio/runners.py @@ -0,0 +1,48 @@ +__all__ = 'run', + +from . import coroutines +from . import events + + +def run(main, *, debug=False): + """Run a coroutine. + + This function runs the passed coroutine, taking care of + managing the asyncio event loop and finalizing asynchronous + generators. + + This function cannot be called when another asyncio event loop is + running in the same thread. + + If debug is True, the event loop will be run in debug mode. + + This function always creates a new event loop and closes it at the end. + It should be used as a main entry point for asyncio programs, and should + ideally only be called once. + + Example: + + async def main(): + await asyncio.sleep(1) + print('hello') + + asyncio.run(main()) + """ + if events._get_running_loop() is not None: + raise RuntimeError( + "asyncio.run() cannot be called from a running event loop") + + if not coroutines.iscoroutine(main): + raise ValueError("a coroutine was expected, got {!r}".format(main)) + + loop = events.new_event_loop() + try: + events.set_event_loop(loop) + loop.set_debug(debug) + return loop.run_until_complete(main) + finally: + try: + loop.run_until_complete(loop.shutdown_asyncgens()) + finally: + events.set_event_loop(None) + loop.close() |