diff options
author | Carol Willing <carolcode@willingconsulting.com> | 2018-09-13 05:40:37 (GMT) |
---|---|---|
committer | Yury Selivanov <yury@magic.io> | 2018-09-13 05:40:37 (GMT) |
commit | 1abba455d1e703b7050c0d183e40c6a9d45798c5 (patch) | |
tree | 368bf91d0b0f61b512e1cf631989b193360a7db2 /Doc/library/asyncio-dev.rst | |
parent | 4ae8ece5cd4c5853b625381db13429f25512108d (diff) | |
download | cpython-1abba455d1e703b7050c0d183e40c6a9d45798c5.zip cpython-1abba455d1e703b7050c0d183e40c6a9d45798c5.tar.gz cpython-1abba455d1e703b7050c0d183e40c6a9d45798c5.tar.bz2 |
Polish doc as part of asyncio doc improvement (GH-9185)
Diffstat (limited to 'Doc/library/asyncio-dev.rst')
-rw-r--r-- | Doc/library/asyncio-dev.rst | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/Doc/library/asyncio-dev.rst b/Doc/library/asyncio-dev.rst index cb574c3..e4986ba 100644 --- a/Doc/library/asyncio-dev.rst +++ b/Doc/library/asyncio-dev.rst @@ -98,9 +98,11 @@ Concurrency and multithreading An event loop runs in a thread (typically the main thread) and executes all callbacks and tasks in its thread. While a task is running in the -event loop, no other task is running in the same thread. When a task -executes an ``await`` expression, the task gets suspended and the -event loop executes the next task. +event loop, no other tasks may run in the same thread. When a task +executes an ``await`` expression, the running task gets suspended, and the +event loop executes the next task. Prior to suspending the task, the awaiting +chain is checked, and if the chain ends with a future, the running task is +not suspended. To schedule a callback from a different thread, the :meth:`loop.call_soon_threadsafe` method should be used. Example:: @@ -123,9 +125,9 @@ To schedule a coroutine object from a different thread, the future = asyncio.run_coroutine_threadsafe(coro_func(), loop) result = future.result(timeout) # Wait for the result with a timeout -The :meth:`loop.run_in_executor` method can be used with a thread pool -executor to execute a callback in different thread to not block the thread of -the event loop. +The :meth:`loop.run_in_executor` method can be used with a +:class:`concurrent.futures.ThreadPoolExecutor` to execute a callback in +different thread so as not to block the event loop's main thread. .. seealso:: @@ -183,9 +185,10 @@ Detect coroutine objects never scheduled ---------------------------------------- When a coroutine function is called and its result is not passed to -:func:`ensure_future` or to the :meth:`loop.create_task` method, -the execution of the coroutine object will never be scheduled which is -probably a bug. :ref:`Enable the debug mode of asyncio <asyncio-debug-mode>` +:meth:`asyncio.create_task` the execution of the coroutine object will +never be scheduled which is probably a bug. Using ``asyncio.create_task`` is +preferred to the low level :func:`ensure_future` and :meth:`loop.create_task` +methods. :ref:`Enable the debug mode of asyncio <asyncio-debug-mode>` to :ref:`log a warning <asyncio-logger>` to detect it. Example with the bug:: @@ -204,8 +207,9 @@ Output in debug mode:: File "test.py", line 7, in <module> test() -The fix is to call the :func:`ensure_future` function or the -:meth:`loop.create_task` method with the coroutine object. +The fix is to call the :meth:`asyncio.create_task` function. Using +``asyncio.create_task`` is preferred to the low level :func:`ensure_future` and +:meth:`loop.create_task` methods. .. seealso:: @@ -280,14 +284,9 @@ coroutine in another coroutine and use classic try/except:: loop.run_forever() loop.close() -Another option is to use the :meth:`loop.run_until_complete` -function:: +Another option is to use the :meth:`asyncio.run` function:: - task = asyncio.ensure_future(bug()) - try: - loop.run_until_complete(task) - except Exception: - print("exception consumed") + asyncio.run(bug()) .. seealso:: |