summaryrefslogtreecommitdiffstats
path: root/Lib/asyncio
diff options
context:
space:
mode:
authorYury Selivanov <yury@magic.io>2017-12-14 14:42:21 (GMT)
committerGitHub <noreply@github.com>2017-12-14 14:42:21 (GMT)
commit02a0a19206da6902c3855a1fa09e60b208474cfa (patch)
treedf9a24bf2a131693ef4f3dad55849c22a1567991 /Lib/asyncio
parenteadad1b97f64619bfd246b9d3b60d25f456e0592 (diff)
downloadcpython-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__.py2
-rw-r--r--Lib/asyncio/runners.py48
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()