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/runners.py | |
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/runners.py')
-rw-r--r-- | Lib/asyncio/runners.py | 48 |
1 files changed, 48 insertions, 0 deletions
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() |