| 
									
										
										
										
											2013-12-20 14:37:39 -05:00
										 |  |  | .. currentmodule:: asyncio
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | ====================
 | 
					
						
							|  |  |  | Coroutines and Tasks
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | ====================
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | This section outlines high-level asyncio APIs to work with coroutines
 | 
					
						
							|  |  |  | and Tasks.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. contents::
 | 
					
						
							|  |  |  |    :depth: 1
 | 
					
						
							|  |  |  |    :local: | 
					
						
							| 
									
										
										
										
											2017-07-25 17:03:51 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | .. _coroutine:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Coroutines
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | ==========
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-18 11:33:40 -08:00
										 |  |  | **Source code:** :source:`Lib/asyncio/coroutines.py`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ----------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-10 19:18:46 -04:00
										 |  |  | :term:`Coroutines <coroutine>` declared with the async/await syntax is the
 | 
					
						
							|  |  |  | preferred way of writing asyncio applications.  For example, the following
 | 
					
						
							| 
									
										
										
										
											2022-05-05 02:14:07 +02:00
										 |  |  | snippet of code prints "hello", waits 1 second,
 | 
					
						
							| 
									
										
										
										
											2018-09-18 02:47:54 -04:00
										 |  |  | and then prints "world"::
 | 
					
						
							| 
									
										
										
										
											2015-06-24 11:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |     >>> import asyncio
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |     >>> async def main():
 | 
					
						
							|  |  |  |     ...     print('hello')
 | 
					
						
							|  |  |  |     ...     await asyncio.sleep(1)
 | 
					
						
							|  |  |  |     ...     print('world')
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |     >>> asyncio.run(main())
 | 
					
						
							|  |  |  |     hello
 | 
					
						
							|  |  |  |     world
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Note that simply calling a coroutine will not schedule it to
 | 
					
						
							|  |  |  | be executed::
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |     >>> main()
 | 
					
						
							|  |  |  |     <coroutine object main at 0x1053bb7c8>
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-27 12:50:48 +09:00
										 |  |  | To actually run a coroutine, asyncio provides the following mechanisms:
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | * The :func:`asyncio.run` function to run the top-level
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |   entry point "main()" function (see the above example.)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | * Awaiting on a coroutine.  The following snippet of code will
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |   print "hello" after waiting for 1 second, and then print "world"
 | 
					
						
							|  |  |  |   after waiting for *another* 2 seconds::
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       import asyncio
 | 
					
						
							|  |  |  |       import time
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       async def say_after(delay, what):
 | 
					
						
							|  |  |  |           await asyncio.sleep(delay)
 | 
					
						
							|  |  |  |           print(what)
 | 
					
						
							| 
									
										
										
										
											2014-08-11 01:11:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       async def main():
 | 
					
						
							| 
									
										
										
										
											2018-10-24 15:37:12 -07:00
										 |  |  |           print(f"started at {time.strftime('%X')}")
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |           await say_after(1, 'hello')
 | 
					
						
							|  |  |  |           await say_after(2, 'world')
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-24 15:37:12 -07:00
										 |  |  |           print(f"finished at {time.strftime('%X')}")
 | 
					
						
							| 
									
										
										
										
											2014-01-16 18:58:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       asyncio.run(main())
 | 
					
						
							| 
									
										
										
										
											2015-06-24 11:04:15 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |   Expected output::
 | 
					
						
							| 
									
										
										
										
											2014-01-16 18:58:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       started at 17:13:52
 | 
					
						
							|  |  |  |       hello
 | 
					
						
							|  |  |  |       world
 | 
					
						
							|  |  |  |       finished at 17:13:55
 | 
					
						
							| 
									
										
										
										
											2014-01-16 18:58:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | * The :func:`asyncio.create_task` function to run coroutines
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |   concurrently as asyncio :class:`Tasks <Task>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 21:49:21 -07:00
										 |  |  |   Let's modify the above example and run two ``say_after`` coroutines
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |   *concurrently*::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       async def main():
 | 
					
						
							|  |  |  |           task1 = asyncio.create_task(
 | 
					
						
							|  |  |  |               say_after(1, 'hello'))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           task2 = asyncio.create_task(
 | 
					
						
							|  |  |  |               say_after(2, 'world'))
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-24 15:37:12 -07:00
										 |  |  |           print(f"started at {time.strftime('%X')}")
 | 
					
						
							| 
									
										
										
										
											2014-02-20 16:20:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |           # Wait until both tasks are completed (should take
 | 
					
						
							|  |  |  |           # around 2 seconds.)
 | 
					
						
							|  |  |  |           await task1
 | 
					
						
							|  |  |  |           await task2
 | 
					
						
							| 
									
										
										
										
											2014-02-20 16:20:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-24 15:37:12 -07:00
										 |  |  |           print(f"finished at {time.strftime('%X')}")
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   Note that expected output now shows that the snippet runs
 | 
					
						
							|  |  |  |   1 second faster than before::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       started at 17:14:32
 | 
					
						
							|  |  |  |       hello
 | 
					
						
							|  |  |  |       world
 | 
					
						
							|  |  |  |       finished at 17:14:34
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-30 09:16:22 -07:00
										 |  |  | * The :class:`asyncio.TaskGroup` class provides a more modern
 | 
					
						
							|  |  |  |   alternative to :func:`create_task`.
 | 
					
						
							|  |  |  |   Using this API, the last example becomes::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       async def main():
 | 
					
						
							|  |  |  |           async with asyncio.TaskGroup() as tg:
 | 
					
						
							|  |  |  |               task1 = tg.create_task(
 | 
					
						
							|  |  |  |                   say_after(1, 'hello'))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               task2 = tg.create_task(
 | 
					
						
							|  |  |  |                   say_after(2, 'world'))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               print(f"started at {time.strftime('%X')}")
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-31 00:36:40 -05:00
										 |  |  |           # The await is implicit when the context manager exits.
 | 
					
						
							| 
									
										
										
										
											2022-06-30 09:16:22 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |           print(f"finished at {time.strftime('%X')}")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   The timing and output should be the same as for the previous version.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   .. versionadded:: 3.11
 | 
					
						
							|  |  |  |      :class:`asyncio.TaskGroup`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. _asyncio-awaitables:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Awaitables
 | 
					
						
							|  |  |  | ==========
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  | We say that an object is an **awaitable** object if it can be used
 | 
					
						
							|  |  |  | in an :keyword:`await` expression.  Many asyncio APIs are designed to
 | 
					
						
							|  |  |  | accept awaitables.
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  | There are three main types of *awaitable* objects:
 | 
					
						
							|  |  |  | **coroutines**, **Tasks**, and **Futures**.
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  | .. rubric:: Coroutines
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Python coroutines are *awaitables* and therefore can be awaited from
 | 
					
						
							|  |  |  | other coroutines::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     async def nested():
 | 
					
						
							|  |  |  |         return 42
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async def main():
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |         # Nothing happens if we just call "nested()".
 | 
					
						
							| 
									
										
										
										
											2018-09-21 16:23:15 -04:00
										 |  |  |         # A coroutine object is created but not awaited,
 | 
					
						
							|  |  |  |         # so it *won't run at all*.
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |         nested()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Let's do it differently now and await it:
 | 
					
						
							|  |  |  |         print(await nested())  # will print "42".
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     asyncio.run(main())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. important::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    In this documentation the term "coroutine" can be used for
 | 
					
						
							|  |  |  |    two closely related concepts:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * a *coroutine function*: an :keyword:`async def` function;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * a *coroutine object*: an object returned by calling a
 | 
					
						
							|  |  |  |      *coroutine function*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. rubric:: Tasks
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | *Tasks* are used to schedule coroutines *concurrently*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  | When a coroutine is wrapped into a *Task* with functions like
 | 
					
						
							|  |  |  | :func:`asyncio.create_task` the coroutine is automatically
 | 
					
						
							|  |  |  | scheduled to run soon::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async def nested():
 | 
					
						
							|  |  |  |         return 42
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |     async def main():
 | 
					
						
							|  |  |  |         # Schedule nested() to run soon concurrently
 | 
					
						
							|  |  |  |         # with "main()".
 | 
					
						
							|  |  |  |         task = asyncio.create_task(nested())
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |         # "task" can now be used to cancel "nested()", or
 | 
					
						
							|  |  |  |         # can simply be awaited to wait until it is complete:
 | 
					
						
							|  |  |  |         await task
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     asyncio.run(main())
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  | .. rubric:: Futures
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  | A :class:`Future` is a special **low-level** awaitable object that
 | 
					
						
							|  |  |  | represents an **eventual result** of an asynchronous operation.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | When a Future object is *awaited* it means that the coroutine will
 | 
					
						
							|  |  |  | wait until the Future is resolved in some other place.
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | Future objects in asyncio are needed to allow callback-based code
 | 
					
						
							|  |  |  | to be used with async/await.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  | Normally **there is no need** to create Future objects at the
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  | application level code.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Future objects, sometimes exposed by libraries and some asyncio
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  | APIs, can be awaited::
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     async def main():
 | 
					
						
							|  |  |  |         await function_that_returns_a_future_object()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # this is also valid:
 | 
					
						
							|  |  |  |         await asyncio.gather(
 | 
					
						
							|  |  |  |             function_that_returns_a_future_object(),
 | 
					
						
							|  |  |  |             some_python_coroutine()
 | 
					
						
							|  |  |  |         )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  | A good example of a low-level function that returns a Future object
 | 
					
						
							|  |  |  | is :meth:`loop.run_in_executor`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Creating Tasks
 | 
					
						
							|  |  |  | ==============
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-18 11:33:40 -08:00
										 |  |  | **Source code:** :source:`Lib/asyncio/tasks.py`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -----------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  | .. function:: create_task(coro, *, name=None, context=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    Wrap the *coro* :ref:`coroutine <coroutine>` into a :class:`Task`
 | 
					
						
							|  |  |  |    and schedule its execution.  Return the Task object.
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If *name* is not ``None``, it is set as the name of the task using
 | 
					
						
							|  |  |  |    :meth:`Task.set_name`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |    An optional keyword-only *context* argument allows specifying a
 | 
					
						
							|  |  |  |    custom :class:`contextvars.Context` for the *coro* to run in.
 | 
					
						
							|  |  |  |    The current context copy is created when no *context* is provided.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    The task is executed in the loop returned by :func:`get_running_loop`,
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    :exc:`RuntimeError` is raised if there is no running loop in
 | 
					
						
							|  |  |  |    current thread.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-30 09:16:22 -07:00
										 |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       :meth:`asyncio.TaskGroup.create_task` is a newer alternative
 | 
					
						
							|  |  |  |       that allows for convenient waiting for a group of related tasks.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-15 18:30:28 -04:00
										 |  |  |    .. important::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Save a reference to the result of this function, to avoid
 | 
					
						
							| 
									
										
										
										
											2022-09-10 16:34:14 +02:00
										 |  |  |       a task disappearing mid-execution. The event loop only keeps
 | 
					
						
							| 
									
										
										
										
											2022-06-07 10:56:09 +02:00
										 |  |  |       weak references to tasks. A task that isn't referenced elsewhere
 | 
					
						
							| 
									
										
										
										
											2022-09-10 16:34:14 +02:00
										 |  |  |       may get garbage collected at any time, even before it's done.
 | 
					
						
							| 
									
										
										
										
											2022-06-07 10:56:09 +02:00
										 |  |  |       For reliable "fire-and-forget" background tasks, gather them in
 | 
					
						
							|  |  |  |       a collection::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           background_tasks = set()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           for i in range(10):
 | 
					
						
							|  |  |  |               task = asyncio.create_task(some_coro(param=i))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               # Add task to the set. This creates a strong reference.
 | 
					
						
							|  |  |  |               background_tasks.add(task)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               # To prevent keeping references to finished tasks forever,
 | 
					
						
							|  |  |  |               # make each task remove its own reference from the set after
 | 
					
						
							|  |  |  |               # completion:
 | 
					
						
							|  |  |  |               task.add_done_callback(background_tasks.discard)
 | 
					
						
							| 
									
										
										
										
											2021-11-15 18:30:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. versionadded:: 3.7
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |       Added the *name* parameter.
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-14 13:54:13 +02:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Added the *context* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-15 04:38:38 +02:00
										 |  |  | Task Cancellation
 | 
					
						
							|  |  |  | =================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Tasks can easily and safely be cancelled.
 | 
					
						
							|  |  |  | When a task is cancelled, :exc:`asyncio.CancelledError` will be raised
 | 
					
						
							|  |  |  | in the task at the next opportunity.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | It is recommended that coroutines use ``try/finally`` blocks to robustly
 | 
					
						
							|  |  |  | perform clean-up logic. In case :exc:`asyncio.CancelledError`
 | 
					
						
							|  |  |  | is explicitly caught, it should generally be propagated when
 | 
					
						
							| 
									
										
										
										
											2023-03-22 17:52:10 +00:00
										 |  |  | clean-up is complete. :exc:`asyncio.CancelledError` directly subclasses
 | 
					
						
							|  |  |  | :exc:`BaseException` so most code will not need to be aware of it.
 | 
					
						
							| 
									
										
										
										
											2022-07-15 04:38:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 19:42:36 +02:00
										 |  |  | The asyncio components that enable structured concurrency, like
 | 
					
						
							|  |  |  | :class:`asyncio.TaskGroup` and :func:`asyncio.timeout`,
 | 
					
						
							|  |  |  | are implemented using cancellation internally and might misbehave if
 | 
					
						
							|  |  |  | a coroutine swallows :exc:`asyncio.CancelledError`. Similarly, user code
 | 
					
						
							| 
									
										
										
										
											2023-03-22 17:52:10 +00:00
										 |  |  | should not generally call :meth:`uncancel <asyncio.Task.uncancel>`.
 | 
					
						
							|  |  |  | However, in cases when suppressing :exc:`asyncio.CancelledError` is
 | 
					
						
							|  |  |  | truly desired, it is necessary to also call ``uncancel()`` to completely
 | 
					
						
							|  |  |  | remove the cancellation state.
 | 
					
						
							| 
									
										
										
										
											2022-07-15 04:38:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 19:42:36 +02:00
										 |  |  | .. _taskgroups:
 | 
					
						
							| 
									
										
										
										
											2022-07-15 04:38:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-30 09:16:22 -07:00
										 |  |  | Task Groups
 | 
					
						
							|  |  |  | ===========
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Task groups combine a task creation API with a convenient
 | 
					
						
							|  |  |  | and reliable way to wait for all tasks in the group to finish.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. class:: TaskGroup()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    An :ref:`asynchronous context manager <async-context-managers>`
 | 
					
						
							|  |  |  |    holding a group of tasks.
 | 
					
						
							|  |  |  |    Tasks can be added to the group using :meth:`create_task`.
 | 
					
						
							|  |  |  |    All tasks are awaited when the context manager exits.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: create_task(coro, *, name=None, context=None)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Create a task in this task group.
 | 
					
						
							|  |  |  |       The signature matches that of :func:`asyncio.create_task`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     async def main():
 | 
					
						
							|  |  |  |         async with asyncio.TaskGroup() as tg:
 | 
					
						
							|  |  |  |             task1 = tg.create_task(some_coro(...))
 | 
					
						
							|  |  |  |             task2 = tg.create_task(another_coro(...))
 | 
					
						
							|  |  |  |         print("Both tasks have completed now.")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The ``async with`` statement will wait for all tasks in the group to finish.
 | 
					
						
							|  |  |  | While waiting, new tasks may still be added to the group
 | 
					
						
							|  |  |  | (for example, by passing ``tg`` into one of the coroutines
 | 
					
						
							|  |  |  | and calling ``tg.create_task()`` in that coroutine).
 | 
					
						
							|  |  |  | Once the last task has finished and the ``async with`` block is exited,
 | 
					
						
							|  |  |  | no new tasks may be added to the group.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The first time any of the tasks belonging to the group fails
 | 
					
						
							|  |  |  | with an exception other than :exc:`asyncio.CancelledError`,
 | 
					
						
							|  |  |  | the remaining tasks in the group are cancelled.
 | 
					
						
							| 
									
										
										
										
											2022-06-30 10:10:46 -07:00
										 |  |  | No further tasks can then be added to the group.
 | 
					
						
							| 
									
										
										
										
											2022-06-30 09:16:22 -07:00
										 |  |  | At this point, if the body of the ``async with`` statement is still active
 | 
					
						
							|  |  |  | (i.e., :meth:`~object.__aexit__` hasn't been called yet),
 | 
					
						
							|  |  |  | the task directly containing the ``async with`` statement is also cancelled.
 | 
					
						
							|  |  |  | The resulting :exc:`asyncio.CancelledError` will interrupt an ``await``,
 | 
					
						
							|  |  |  | but it will not bubble out of the containing ``async with`` statement.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Once all tasks have finished, if any tasks have failed
 | 
					
						
							|  |  |  | with an exception other than :exc:`asyncio.CancelledError`,
 | 
					
						
							|  |  |  | those exceptions are combined in an
 | 
					
						
							|  |  |  | :exc:`ExceptionGroup` or :exc:`BaseExceptionGroup`
 | 
					
						
							|  |  |  | (as appropriate; see their documentation)
 | 
					
						
							|  |  |  | which is then raised.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Two base exceptions are treated specially:
 | 
					
						
							|  |  |  | If any task fails with :exc:`KeyboardInterrupt` or :exc:`SystemExit`,
 | 
					
						
							|  |  |  | the task group still cancels the remaining tasks and waits for them,
 | 
					
						
							|  |  |  | but then the initial :exc:`KeyboardInterrupt` or :exc:`SystemExit`
 | 
					
						
							|  |  |  | is re-raised instead of :exc:`ExceptionGroup` or :exc:`BaseExceptionGroup`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If the body of the ``async with`` statement exits with an exception
 | 
					
						
							|  |  |  | (so :meth:`~object.__aexit__` is called with an exception set),
 | 
					
						
							|  |  |  | this is treated the same as if one of the tasks failed:
 | 
					
						
							|  |  |  | the remaining tasks are cancelled and then waited for,
 | 
					
						
							|  |  |  | and non-cancellation exceptions are grouped into an
 | 
					
						
							|  |  |  | exception group and raised.
 | 
					
						
							|  |  |  | The exception passed into :meth:`~object.__aexit__`,
 | 
					
						
							|  |  |  | unless it is :exc:`asyncio.CancelledError`,
 | 
					
						
							|  |  |  | is also included in the exception group.
 | 
					
						
							|  |  |  | The same special case is made for
 | 
					
						
							|  |  |  | :exc:`KeyboardInterrupt` and :exc:`SystemExit` as in the previous paragraph.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Sleeping
 | 
					
						
							|  |  |  | ========
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 14:50:57 +02:00
										 |  |  | .. coroutinefunction:: sleep(delay, result=None)
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Block for *delay* seconds.
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If *result* is provided, it is returned to the caller
 | 
					
						
							|  |  |  |    when the coroutine completes.
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-01 12:09:38 +02:00
										 |  |  |    ``sleep()`` always suspends the current task, allowing other tasks
 | 
					
						
							|  |  |  |    to run.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-06 18:03:18 -08:00
										 |  |  |    Setting the delay to 0 provides an optimized path to allow other
 | 
					
						
							|  |  |  |    tasks to run. This can be used by long-running functions to avoid
 | 
					
						
							|  |  |  |    blocking the event loop for the full duration of the function call.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 15:11:24 -07:00
										 |  |  |    .. _asyncio_example_sleep:
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Example of coroutine displaying the current date every second
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    for 5 seconds::
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     import asyncio
 | 
					
						
							|  |  |  |     import datetime
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-14 09:42:21 -05:00
										 |  |  |     async def display_date():
 | 
					
						
							|  |  |  |         loop = asyncio.get_running_loop()
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  |         end_time = loop.time() + 5.0
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  |         while True:
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  |             print(datetime.datetime.now())
 | 
					
						
							|  |  |  |             if (loop.time() + 1.0) >= end_time:
 | 
					
						
							|  |  |  |                 break
 | 
					
						
							| 
									
										
										
										
											2015-06-24 11:04:15 -04:00
										 |  |  |             await asyncio.sleep(1)
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-14 09:42:21 -05:00
										 |  |  |     asyncio.run(display_date())
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Running Tasks Concurrently
 | 
					
						
							|  |  |  | ==========================
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. awaitablefunction:: gather(*aws, return_exceptions=False)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    Run :ref:`awaitable objects <asyncio-awaitables>` in the *aws*
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    sequence *concurrently*.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    If any awaitable in *aws* is a coroutine, it is automatically
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    scheduled as a Task.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    If all awaitables are completed successfully, the result is an
 | 
					
						
							|  |  |  |    aggregate list of returned values.  The order of result values
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    corresponds to the order of awaitables in *aws*.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 16:23:15 -04:00
										 |  |  |    If *return_exceptions* is ``False`` (default), the first
 | 
					
						
							|  |  |  |    raised exception is immediately propagated to the task that
 | 
					
						
							|  |  |  |    awaits on ``gather()``.  Other awaitables in the *aws* sequence
 | 
					
						
							|  |  |  |    **won't be cancelled** and will continue to run.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    If *return_exceptions* is ``True``, exceptions are treated the
 | 
					
						
							|  |  |  |    same as successful results, and aggregated in the result list.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 16:23:15 -04:00
										 |  |  |    If ``gather()`` is *cancelled*, all submitted awaitables
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    (that have not completed yet) are also *cancelled*.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    If any Task or Future from the *aws* sequence is *cancelled*, it is
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    treated as if it raised :exc:`CancelledError` -- the ``gather()``
 | 
					
						
							|  |  |  |    call is **not** cancelled in this case.  This is to prevent the
 | 
					
						
							|  |  |  |    cancellation of one submitted Task/Future to cause other
 | 
					
						
							|  |  |  |    Tasks/Futures to be cancelled.
 | 
					
						
							| 
									
										
										
										
											2017-12-23 15:04:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-30 09:16:22 -07:00
										 |  |  |    .. note::
 | 
					
						
							|  |  |  |       A more modern way to create and run tasks concurrently and
 | 
					
						
							|  |  |  |       wait for their completion is :class:`asyncio.TaskGroup`.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 15:11:24 -07:00
										 |  |  |    .. _asyncio_example_gather:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Example::
 | 
					
						
							| 
									
										
										
										
											2017-12-23 15:04:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       import asyncio
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       async def factorial(name, number):
 | 
					
						
							|  |  |  |           f = 1
 | 
					
						
							|  |  |  |           for i in range(2, number + 1):
 | 
					
						
							| 
									
										
										
										
											2021-05-14 08:06:26 +02:00
										 |  |  |               print(f"Task {name}: Compute factorial({number}), currently i={i}...")
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |               await asyncio.sleep(1)
 | 
					
						
							|  |  |  |               f *= i
 | 
					
						
							|  |  |  |           print(f"Task {name}: factorial({number}) = {f}")
 | 
					
						
							| 
									
										
										
										
											2021-05-14 08:06:26 +02:00
										 |  |  |           return f
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       async def main():
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |           # Schedule three calls *concurrently*:
 | 
					
						
							| 
									
										
										
										
											2021-05-14 08:06:26 +02:00
										 |  |  |           L = await asyncio.gather(
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |               factorial("A", 2),
 | 
					
						
							|  |  |  |               factorial("B", 3),
 | 
					
						
							|  |  |  |               factorial("C", 4),
 | 
					
						
							| 
									
										
										
										
											2018-09-18 08:01:26 +02:00
										 |  |  |           )
 | 
					
						
							| 
									
										
										
										
											2021-05-14 08:06:26 +02:00
										 |  |  |           print(L)
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       asyncio.run(main())
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       # Expected output:
 | 
					
						
							|  |  |  |       #
 | 
					
						
							| 
									
										
										
										
											2021-05-14 08:06:26 +02:00
										 |  |  |       #     Task A: Compute factorial(2), currently i=2...
 | 
					
						
							|  |  |  |       #     Task B: Compute factorial(3), currently i=2...
 | 
					
						
							|  |  |  |       #     Task C: Compute factorial(4), currently i=2...
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       #     Task A: factorial(2) = 2
 | 
					
						
							| 
									
										
										
										
											2021-05-14 08:06:26 +02:00
										 |  |  |       #     Task B: Compute factorial(3), currently i=3...
 | 
					
						
							|  |  |  |       #     Task C: Compute factorial(4), currently i=3...
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       #     Task B: factorial(3) = 6
 | 
					
						
							| 
									
										
										
										
											2021-05-14 08:06:26 +02:00
										 |  |  |       #     Task C: Compute factorial(4), currently i=4...
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       #     Task C: factorial(4) = 24
 | 
					
						
							| 
									
										
										
										
											2021-05-14 08:06:26 +02:00
										 |  |  |       #     [2, 6, 24]
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-20 14:12:57 +05:30
										 |  |  |    .. note::
 | 
					
						
							|  |  |  |       If *return_exceptions* is False, cancelling gather() after it
 | 
					
						
							|  |  |  |       has been marked done won't cancel any submitted awaitables.
 | 
					
						
							|  |  |  |       For instance, gather can be marked done after propagating an
 | 
					
						
							|  |  |  |       exception to the caller, therefore, calling ``gather.cancel()``
 | 
					
						
							|  |  |  |       after catching an exception (raised by one of the awaitables) from
 | 
					
						
							|  |  |  |       gather won't cancel any other awaitables.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       If the *gather* itself is cancelled, the cancellation is
 | 
					
						
							|  |  |  |       propagated regardless of *return_exceptions*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-25 13:40:44 +03:00
										 |  |  |    .. deprecated:: 3.10
 | 
					
						
							|  |  |  |       Deprecation warning is emitted if no positional arguments are provided
 | 
					
						
							|  |  |  |       or not all positional arguments are Future-like objects
 | 
					
						
							|  |  |  |       and there is no running event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 16:23:15 -04:00
										 |  |  | Shielding From Cancellation
 | 
					
						
							|  |  |  | ===========================
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 14:50:57 +02:00
										 |  |  | .. awaitablefunction:: shield(aw)
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    Protect an :ref:`awaitable object <asyncio-awaitables>`
 | 
					
						
							|  |  |  |    from being :meth:`cancelled <Task.cancel>`.
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 16:23:15 -04:00
										 |  |  |    If *aw* is a coroutine it is automatically scheduled as a Task.
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    The statement::
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-10 16:34:14 +02:00
										 |  |  |        task = asyncio.create_task(something())
 | 
					
						
							|  |  |  |        res = await shield(task)
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    is equivalent to::
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |        res = await something()
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    *except* that if the coroutine containing it is cancelled, the
 | 
					
						
							|  |  |  |    Task running in ``something()`` is not cancelled.  From the point
 | 
					
						
							|  |  |  |    of view of ``something()``, the cancellation did not happen.
 | 
					
						
							|  |  |  |    Although its caller is still cancelled, so the "await" expression
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    still raises a :exc:`CancelledError`.
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If ``something()`` is cancelled by other means (i.e. from within
 | 
					
						
							|  |  |  |    itself) that would also cancel ``shield()``.
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If it is desired to completely ignore cancellation (not recommended)
 | 
					
						
							|  |  |  |    the ``shield()`` function should be combined with a try/except
 | 
					
						
							|  |  |  |    clause, as follows::
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-10 16:34:14 +02:00
										 |  |  |        task = asyncio.create_task(something())
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |        try:
 | 
					
						
							| 
									
										
										
										
											2022-09-10 16:34:14 +02:00
										 |  |  |            res = await shield(task)
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |        except CancelledError:
 | 
					
						
							|  |  |  |            res = None
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-10 16:34:14 +02:00
										 |  |  |    .. important::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Save a reference to tasks passed to this function, to avoid
 | 
					
						
							|  |  |  |       a task disappearing mid-execution. The event loop only keeps
 | 
					
						
							|  |  |  |       weak references to tasks. A task that isn't referenced elsewhere
 | 
					
						
							|  |  |  |       may get garbage collected at any time, even before it's done.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-25 13:40:44 +03:00
										 |  |  |    .. deprecated:: 3.10
 | 
					
						
							|  |  |  |       Deprecation warning is emitted if *aw* is not Future-like object
 | 
					
						
							|  |  |  |       and there is no running event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-15 07:04:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Timeouts
 | 
					
						
							|  |  |  | ========
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-15 04:38:38 +02:00
										 |  |  | .. coroutinefunction:: timeout(delay)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     An :ref:`asynchronous context manager <async-context-managers>`
 | 
					
						
							|  |  |  |     that can be used to limit the amount of time spent waiting on
 | 
					
						
							|  |  |  |     something.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     *delay* can either be ``None``, or a float/int number of
 | 
					
						
							|  |  |  |     seconds to wait. If *delay* is ``None``, no time limit will
 | 
					
						
							|  |  |  |     be applied; this can be useful if the delay is unknown when
 | 
					
						
							|  |  |  |     the context manager is created.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     In either case, the context manager can be rescheduled after
 | 
					
						
							|  |  |  |     creation using :meth:`Timeout.reschedule`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async def main():
 | 
					
						
							|  |  |  |             async with asyncio.timeout(10):
 | 
					
						
							|  |  |  |                 await long_running_task()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If ``long_running_task`` takes more than 10 seconds to complete,
 | 
					
						
							|  |  |  |     the context manager will cancel the current task and handle
 | 
					
						
							|  |  |  |     the resulting :exc:`asyncio.CancelledError` internally, transforming it
 | 
					
						
							|  |  |  |     into an :exc:`asyncio.TimeoutError` which can be caught and handled.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The :func:`asyncio.timeout` context manager is what transforms
 | 
					
						
							|  |  |  |       the :exc:`asyncio.CancelledError` into an :exc:`asyncio.TimeoutError`,
 | 
					
						
							|  |  |  |       which means the :exc:`asyncio.TimeoutError` can only be caught
 | 
					
						
							|  |  |  |       *outside* of the context manager.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Example of catching :exc:`asyncio.TimeoutError`::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async def main():
 | 
					
						
							|  |  |  |             try:
 | 
					
						
							|  |  |  |                 async with asyncio.timeout(10):
 | 
					
						
							|  |  |  |                     await long_running_task()
 | 
					
						
							|  |  |  |             except TimeoutError:
 | 
					
						
							|  |  |  |                 print("The long operation timed out, but we've handled it.")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             print("This statement will run regardless.")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The context manager produced by :func:`asyncio.timeout` can be
 | 
					
						
							|  |  |  |     rescheduled to a different deadline and inspected.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-23 16:43:13 +00:00
										 |  |  |     .. class:: Timeout(when)
 | 
					
						
							| 
									
										
										
										
											2022-07-15 04:38:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |        An :ref:`asynchronous context manager <async-context-managers>`
 | 
					
						
							| 
									
										
										
										
											2023-03-23 16:43:13 +00:00
										 |  |  |        for cancelling overdue coroutines.
 | 
					
						
							| 
									
										
										
										
											2022-07-15 04:38:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-23 16:43:13 +00:00
										 |  |  |        ``when`` should be an absolute time at which the context should time out,
 | 
					
						
							|  |  |  |        as measured by the event loop's clock:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        - If ``when`` is ``None``, the timeout will never trigger.
 | 
					
						
							|  |  |  |        - If ``when < loop.time()``, the timeout will trigger on the next
 | 
					
						
							|  |  |  |          iteration of the event loop.
 | 
					
						
							| 
									
										
										
										
											2022-07-15 04:38:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         .. method:: when() -> float | None
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            Return the current deadline, or ``None`` if the current
 | 
					
						
							|  |  |  |            deadline is not set.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         .. method:: reschedule(when: float | None)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-23 16:43:13 +00:00
										 |  |  |             Reschedule the timeout.
 | 
					
						
							| 
									
										
										
										
											2022-07-24 21:18:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-15 04:38:38 +02:00
										 |  |  |         .. method:: expired() -> bool
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            Return whether the context manager has exceeded its deadline
 | 
					
						
							|  |  |  |            (expired).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async def main():
 | 
					
						
							|  |  |  |             try:
 | 
					
						
							|  |  |  |                 # We do not know the timeout when starting, so we pass ``None``.
 | 
					
						
							|  |  |  |                 async with asyncio.timeout(None) as cm:
 | 
					
						
							|  |  |  |                     # We know the timeout now, so we reschedule it.
 | 
					
						
							|  |  |  |                     new_deadline = get_running_loop().time() + 10
 | 
					
						
							|  |  |  |                     cm.reschedule(new_deadline)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     await long_running_task()
 | 
					
						
							|  |  |  |             except TimeoutError:
 | 
					
						
							|  |  |  |                 pass
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-01 23:38:31 +05:30
										 |  |  |             if cm.expired():
 | 
					
						
							| 
									
										
										
										
											2022-07-15 04:38:38 +02:00
										 |  |  |                 print("Looks like we haven't finished on time.")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Timeout context managers can be safely nested.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. coroutinefunction:: timeout_at(when)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Similar to :func:`asyncio.timeout`, except *when* is the absolute time
 | 
					
						
							|  |  |  |    to stop waiting, or ``None``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       async def main():
 | 
					
						
							|  |  |  |           loop = get_running_loop()
 | 
					
						
							|  |  |  |           deadline = loop.time() + 20
 | 
					
						
							|  |  |  |           try:
 | 
					
						
							|  |  |  |               async with asyncio.timeout_at(deadline):
 | 
					
						
							|  |  |  |                   await long_running_task()
 | 
					
						
							|  |  |  |           except TimeoutError:
 | 
					
						
							|  |  |  |               print("The long operation timed out, but we've handled it.")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           print("This statement will run regardless.")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 14:50:57 +02:00
										 |  |  | .. coroutinefunction:: wait_for(aw, timeout)
 | 
					
						
							| 
									
										
										
										
											2017-12-15 07:04:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    Wait for the *aw* :ref:`awaitable <asyncio-awaitables>`
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    to complete with a timeout.
 | 
					
						
							| 
									
										
										
										
											2017-12-15 07:04:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    If *aw* is a coroutine it is automatically scheduled as a Task.
 | 
					
						
							| 
									
										
										
										
											2017-12-15 07:04:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    *timeout* can either be ``None`` or a float or int number of seconds
 | 
					
						
							|  |  |  |    to wait for.  If *timeout* is ``None``, block until the future
 | 
					
						
							|  |  |  |    completes.
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If a timeout occurs, it cancels the task and raises
 | 
					
						
							| 
									
										
										
										
											2021-12-19 16:52:40 +05:30
										 |  |  |    :exc:`TimeoutError`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    To avoid the task :meth:`cancellation <Task.cancel>`,
 | 
					
						
							|  |  |  |    wrap it in :func:`shield`.
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    The function will wait until the future is actually cancelled,
 | 
					
						
							| 
									
										
										
										
											2020-05-15 23:12:05 +03:00
										 |  |  |    so the total wait time may exceed the *timeout*. If an exception
 | 
					
						
							|  |  |  |    happens during cancellation, it is propagated.
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    If the wait is cancelled, the future *aw* is also cancelled.
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 15:11:24 -07:00
										 |  |  |    .. _asyncio_example_waitfor:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Example::
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |        async def eternity():
 | 
					
						
							|  |  |  |            # Sleep for one hour
 | 
					
						
							|  |  |  |            await asyncio.sleep(3600)
 | 
					
						
							|  |  |  |            print('yay!')
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |        async def main():
 | 
					
						
							|  |  |  |            # Wait for at most 1 second
 | 
					
						
							|  |  |  |            try:
 | 
					
						
							|  |  |  |                await asyncio.wait_for(eternity(), timeout=1.0)
 | 
					
						
							| 
									
										
										
										
											2021-12-19 16:52:40 +05:30
										 |  |  |            except TimeoutError:
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |                print('timeout!')
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |        asyncio.run(main())
 | 
					
						
							| 
									
										
										
										
											2018-05-23 13:35:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |        # Expected output:
 | 
					
						
							|  |  |  |        #
 | 
					
						
							|  |  |  |        #     timeout!
 | 
					
						
							| 
									
										
										
										
											2015-02-25 14:24:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-23 13:35:04 -04:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |       When *aw* is cancelled due to a timeout, ``wait_for`` waits
 | 
					
						
							|  |  |  |       for *aw* to be cancelled.  Previously, it raised
 | 
					
						
							| 
									
										
										
										
											2021-12-19 16:52:40 +05:30
										 |  |  |       :exc:`TimeoutError` immediately.
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Waiting Primitives
 | 
					
						
							|  |  |  | ==================
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. coroutinefunction:: wait(aws, *, timeout=None, return_when=ALL_COMPLETED)
 | 
					
						
							| 
									
										
										
										
											2014-06-02 23:06:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 22:51:40 +02:00
										 |  |  |    Run :class:`~asyncio.Future` and :class:`~asyncio.Task` instances in the *aws*
 | 
					
						
							| 
									
										
										
										
											2020-11-02 11:56:35 +01:00
										 |  |  |    iterable concurrently and block until the condition specified
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    by *return_when*.
 | 
					
						
							| 
									
										
										
										
											2014-06-02 23:06:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-02 11:56:35 +01:00
										 |  |  |    The *aws* iterable must not be empty.
 | 
					
						
							| 
									
										
										
										
											2020-05-04 23:56:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Returns two sets of Tasks/Futures: ``(done, pending)``.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-25 14:51:21 -04:00
										 |  |  |    Usage::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         done, pending = await asyncio.wait(aws)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    *timeout* (a float or int), if specified, can be used to control
 | 
					
						
							|  |  |  |    the maximum number of seconds to wait before returning.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 16:52:40 +05:30
										 |  |  |    Note that this function does not raise :exc:`TimeoutError`.
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Futures or Tasks that aren't done when the timeout occurs are simply
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    returned in the second set.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    *return_when* indicates when this function should return.  It must
 | 
					
						
							|  |  |  |    be one of the following constants:
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. tabularcolumns:: |l|L|
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    +-----------------------------+----------------------------------------+
 | 
					
						
							|  |  |  |    | Constant                    | Description                            |
 | 
					
						
							|  |  |  |    +=============================+========================================+
 | 
					
						
							|  |  |  |    | :const:`FIRST_COMPLETED`    | The function will return when any      |
 | 
					
						
							|  |  |  |    |                             | future finishes or is cancelled.       |
 | 
					
						
							|  |  |  |    +-----------------------------+----------------------------------------+
 | 
					
						
							|  |  |  |    | :const:`FIRST_EXCEPTION`    | The function will return when any      |
 | 
					
						
							|  |  |  |    |                             | future finishes by raising an          |
 | 
					
						
							|  |  |  |    |                             | exception.  If no future raises an     |
 | 
					
						
							|  |  |  |    |                             | exception then it is equivalent to     |
 | 
					
						
							|  |  |  |    |                             | :const:`ALL_COMPLETED`.                |
 | 
					
						
							|  |  |  |    +-----------------------------+----------------------------------------+
 | 
					
						
							|  |  |  |    | :const:`ALL_COMPLETED`      | The function will return when all      |
 | 
					
						
							|  |  |  |    |                             | futures finish or are cancelled.       |
 | 
					
						
							|  |  |  |    +-----------------------------+----------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Unlike :func:`~asyncio.wait_for`, ``wait()`` does not cancel the
 | 
					
						
							|  |  |  |    futures when a timeout occurs.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 22:51:40 +02:00
										 |  |  |    .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |       Passing coroutine objects to ``wait()`` directly is forbidden.
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-17 06:58:43 +05:30
										 |  |  |    .. versionchanged:: 3.12
 | 
					
						
							|  |  |  |       Added support for generators yielding tasks.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. function:: as_completed(aws, *, timeout=None)
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    Run :ref:`awaitable objects <asyncio-awaitables>` in the *aws*
 | 
					
						
							| 
									
										
										
										
											2020-11-02 11:56:35 +01:00
										 |  |  |    iterable concurrently.  Return an iterator of coroutines.
 | 
					
						
							| 
									
										
										
										
											2020-05-24 02:14:31 +03:00
										 |  |  |    Each coroutine returned can be awaited to get the earliest next
 | 
					
						
							| 
									
										
										
										
											2020-11-02 11:56:35 +01:00
										 |  |  |    result from the iterable of the remaining awaitables.
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 16:52:40 +05:30
										 |  |  |    Raises :exc:`TimeoutError` if the timeout occurs before
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    all Futures are done.
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Example::
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-24 02:14:31 +03:00
										 |  |  |        for coro in as_completed(aws):
 | 
					
						
							|  |  |  |            earliest_result = await coro
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |            # ...
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |    .. versionchanged:: 3.10
 | 
					
						
							|  |  |  |       Removed the *loop* parameter.
 | 
					
						
							| 
									
										
										
										
											2021-05-27 05:59:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-25 13:40:44 +03:00
										 |  |  |    .. deprecated:: 3.10
 | 
					
						
							|  |  |  |       Deprecation warning is emitted if not all awaitable objects in the *aws*
 | 
					
						
							|  |  |  |       iterable are Future-like objects and there is no running event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-18 23:03:28 -04:00
										 |  |  | Running in Threads
 | 
					
						
							|  |  |  | ==================
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. coroutinefunction:: to_thread(func, /, *args, **kwargs)
 | 
					
						
							| 
									
										
										
										
											2020-05-18 23:03:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Asynchronously run function *func* in a separate thread.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Any \*args and \*\*kwargs supplied for this function are directly passed
 | 
					
						
							| 
									
										
										
										
											2020-11-24 00:56:30 +01:00
										 |  |  |    to *func*. Also, the current :class:`contextvars.Context` is propagated,
 | 
					
						
							| 
									
										
										
										
											2020-05-21 01:20:43 -04:00
										 |  |  |    allowing context variables from the event loop thread to be accessed in the
 | 
					
						
							|  |  |  |    separate thread.
 | 
					
						
							| 
									
										
										
										
											2020-05-18 23:03:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-31 03:07:04 -04:00
										 |  |  |    Return a coroutine that can be awaited to get the eventual result of *func*.
 | 
					
						
							| 
									
										
										
										
											2020-05-18 23:03:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This coroutine function is primarily intended to be used for executing
 | 
					
						
							|  |  |  |    IO-bound functions/methods that would otherwise block the event loop if
 | 
					
						
							| 
									
										
										
										
											2021-07-19 22:46:42 +02:00
										 |  |  |    they were run in the main thread. For example::
 | 
					
						
							| 
									
										
										
										
											2020-05-18 23:03:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |        def blocking_io():
 | 
					
						
							|  |  |  |            print(f"start blocking_io at {time.strftime('%X')}")
 | 
					
						
							|  |  |  |            # Note that time.sleep() can be replaced with any blocking
 | 
					
						
							|  |  |  |            # IO-bound operation, such as file operations.
 | 
					
						
							|  |  |  |            time.sleep(1)
 | 
					
						
							|  |  |  |            print(f"blocking_io complete at {time.strftime('%X')}")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        async def main():
 | 
					
						
							|  |  |  |            print(f"started main at {time.strftime('%X')}")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            await asyncio.gather(
 | 
					
						
							|  |  |  |                asyncio.to_thread(blocking_io),
 | 
					
						
							|  |  |  |                asyncio.sleep(1))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            print(f"finished main at {time.strftime('%X')}")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        asyncio.run(main())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        # Expected output:
 | 
					
						
							|  |  |  |        #
 | 
					
						
							|  |  |  |        # started main at 19:50:53
 | 
					
						
							|  |  |  |        # start blocking_io at 19:50:53
 | 
					
						
							|  |  |  |        # blocking_io complete at 19:50:54
 | 
					
						
							|  |  |  |        # finished main at 19:50:54
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-06 18:01:30 -07:00
										 |  |  |    Directly calling ``blocking_io()`` in any coroutine would block the event loop
 | 
					
						
							| 
									
										
										
										
											2020-05-18 23:03:28 -04:00
										 |  |  |    for its duration, resulting in an additional 1 second of run time. Instead,
 | 
					
						
							| 
									
										
										
										
											2022-10-06 18:01:30 -07:00
										 |  |  |    by using ``asyncio.to_thread()``, we can run it in a separate thread without
 | 
					
						
							| 
									
										
										
										
											2020-05-18 23:03:28 -04:00
										 |  |  |    blocking the event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-06 18:01:30 -07:00
										 |  |  |       Due to the :term:`GIL`, ``asyncio.to_thread()`` can typically only be used
 | 
					
						
							| 
									
										
										
										
											2020-05-18 23:03:28 -04:00
										 |  |  |       to make IO-bound functions non-blocking. However, for extension modules
 | 
					
						
							|  |  |  |       that release the GIL or alternative Python implementations that don't
 | 
					
						
							| 
									
										
										
										
											2022-10-06 18:01:30 -07:00
										 |  |  |       have one, ``asyncio.to_thread()`` can also be used for CPU-bound functions.
 | 
					
						
							| 
									
										
										
										
											2020-05-18 23:03:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-21 01:20:43 -04:00
										 |  |  |    .. versionadded:: 3.9
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-18 23:03:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Scheduling From Other Threads
 | 
					
						
							|  |  |  | =============================
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. function:: run_coroutine_threadsafe(coro, loop)
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Submit a coroutine to the given event loop.  Thread-safe.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 17:55:44 -04:00
										 |  |  |    Return a :class:`concurrent.futures.Future` to wait for the result
 | 
					
						
							|  |  |  |    from another OS thread.
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    This function is meant to be called from a different OS thread
 | 
					
						
							|  |  |  |    than the one where the event loop is running.  Example::
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |      # Create a coroutine
 | 
					
						
							|  |  |  |      coro = asyncio.sleep(1, result=3)
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |      # Submit the coroutine to a given loop
 | 
					
						
							|  |  |  |      future = asyncio.run_coroutine_threadsafe(coro, loop)
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |      # Wait for the result with an optional timeout argument
 | 
					
						
							|  |  |  |      assert future.result(timeout) == 3
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If an exception is raised in the coroutine, the returned Future
 | 
					
						
							|  |  |  |    will be notified.  It can also be used to cancel the task in
 | 
					
						
							|  |  |  |    the event loop::
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |      try:
 | 
					
						
							|  |  |  |          result = future.result(timeout)
 | 
					
						
							| 
									
										
										
										
											2021-12-19 16:52:40 +05:30
										 |  |  |      except TimeoutError:
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |          print('The coroutine took too long, cancelling the task...')
 | 
					
						
							|  |  |  |          future.cancel()
 | 
					
						
							|  |  |  |      except Exception as exc:
 | 
					
						
							| 
									
										
										
										
											2018-10-24 15:37:12 -07:00
										 |  |  |          print(f'The coroutine raised an exception: {exc!r}')
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |      else:
 | 
					
						
							| 
									
										
										
										
											2018-10-24 15:37:12 -07:00
										 |  |  |          print(f'The coroutine returned: {result!r}')
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:51:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    See the :ref:`concurrency and multithreading <asyncio-multithreading>`
 | 
					
						
							|  |  |  |    section of the documentation.
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-26 20:17:17 +05:30
										 |  |  |    Unlike other asyncio functions this function requires the *loop*
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    argument to be passed explicitly.
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. versionadded:: 3.5.1
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-20 07:02:22 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Introspection
 | 
					
						
							|  |  |  | =============
 | 
					
						
							| 
									
										
										
										
											2014-01-20 07:02:22 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-16 21:58:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-12 20:50:50 +02:00
										 |  |  | .. function:: current_task(loop=None)
 | 
					
						
							| 
									
										
										
										
											2017-12-16 21:58:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Return the currently running :class:`Task` instance, or ``None`` if
 | 
					
						
							| 
									
										
										
										
											2017-12-16 21:58:38 +02:00
										 |  |  |    no task is running.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    If *loop* is ``None`` :func:`get_running_loop` is used to get
 | 
					
						
							|  |  |  |    the current loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-12 20:50:50 +02:00
										 |  |  | .. function:: all_tasks(loop=None)
 | 
					
						
							| 
									
										
										
										
											2017-12-16 21:58:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Return a set of not yet finished :class:`Task` objects run by
 | 
					
						
							|  |  |  |    the loop.
 | 
					
						
							| 
									
										
										
										
											2017-12-16 21:58:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-28 17:54:02 -04:00
										 |  |  |    If *loop* is ``None``, :func:`get_running_loop` is used for getting
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    current loop.
 | 
					
						
							| 
									
										
										
										
											2017-12-16 21:58:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-24 13:23:35 +02:00
										 |  |  | .. function:: iscoroutine(obj)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return ``True`` if *obj* is a coroutine object.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.4
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Task Object
 | 
					
						
							|  |  |  | ===========
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  | .. class:: Task(coro, *, loop=None, name=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-21 16:23:15 -04:00
										 |  |  |    A :class:`Future-like <Future>` object that runs a Python
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    :ref:`coroutine <coroutine>`.  Not thread-safe.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Tasks are used to run coroutines in event loops.
 | 
					
						
							|  |  |  |    If a coroutine awaits on a Future, the Task suspends
 | 
					
						
							|  |  |  |    the execution of the coroutine and waits for the completion
 | 
					
						
							|  |  |  |    of the Future.  When the Future is *done*, the execution of
 | 
					
						
							|  |  |  |    the wrapped coroutine resumes.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Event loops use cooperative scheduling: an event loop runs
 | 
					
						
							|  |  |  |    one Task at a time.  While a Task awaits for the completion of a
 | 
					
						
							|  |  |  |    Future, the event loop runs other Tasks, callbacks, or performs
 | 
					
						
							|  |  |  |    IO operations.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Use the high-level :func:`asyncio.create_task` function to create
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Tasks, or the low-level :meth:`loop.create_task` or
 | 
					
						
							|  |  |  |    :func:`ensure_future` functions.  Manual instantiation of Tasks
 | 
					
						
							|  |  |  |    is discouraged.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    To cancel a running Task use the :meth:`cancel` method.  Calling it
 | 
					
						
							|  |  |  |    will cause the Task to throw a :exc:`CancelledError` exception into
 | 
					
						
							|  |  |  |    the wrapped coroutine.  If a coroutine is awaiting on a Future
 | 
					
						
							|  |  |  |    object during cancellation, the Future object will be cancelled.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    :meth:`cancelled` can be used to check if the Task was cancelled.
 | 
					
						
							|  |  |  |    The method returns ``True`` if the wrapped coroutine did not
 | 
					
						
							|  |  |  |    suppress the :exc:`CancelledError` exception and was actually
 | 
					
						
							|  |  |  |    cancelled.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    :class:`asyncio.Task` inherits from :class:`Future` all of its
 | 
					
						
							|  |  |  |    APIs except :meth:`Future.set_result` and
 | 
					
						
							|  |  |  |    :meth:`Future.set_exception`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Tasks support the :mod:`contextvars` module.  When a Task
 | 
					
						
							|  |  |  |    is created it copies the current context and later runs its
 | 
					
						
							|  |  |  |    coroutine in the copied context.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       Added support for the :mod:`contextvars` module.
 | 
					
						
							| 
									
										
										
										
											2015-05-11 16:33:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							| 
									
										
										
										
											2022-02-18 10:58:48 +02:00
										 |  |  |       Added the *name* parameter.
 | 
					
						
							| 
									
										
										
										
											2019-09-12 15:40:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-25 13:40:44 +03:00
										 |  |  |    .. deprecated:: 3.10
 | 
					
						
							|  |  |  |       Deprecation warning is emitted if *loop* is not specified
 | 
					
						
							|  |  |  |       and there is no running event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. method:: done()
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Return ``True`` if the Task is *done*.
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       A Task is *done* when the wrapped coroutine either returned
 | 
					
						
							|  |  |  |       a value, raised an exception, or the Task was cancelled.
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 12:43:59 -04:00
										 |  |  |    .. method:: result()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return the result of the Task.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If the Task is *done*, the result of the wrapped coroutine
 | 
					
						
							|  |  |  |       is returned (or if the coroutine raised an exception, that
 | 
					
						
							|  |  |  |       exception is re-raised.)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If the Task has been *cancelled*, this method raises
 | 
					
						
							|  |  |  |       a :exc:`CancelledError` exception.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If the Task's result isn't yet available, this method raises
 | 
					
						
							|  |  |  |       a :exc:`InvalidStateError` exception.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: exception()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return the exception of the Task.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If the wrapped coroutine raised an exception that exception
 | 
					
						
							|  |  |  |       is returned.  If the wrapped coroutine returned normally
 | 
					
						
							|  |  |  |       this method returns ``None``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If the Task has been *cancelled*, this method raises a
 | 
					
						
							|  |  |  |       :exc:`CancelledError` exception.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If the Task isn't *done* yet, this method raises an
 | 
					
						
							|  |  |  |       :exc:`InvalidStateError` exception.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: add_done_callback(callback, *, context=None)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Add a callback to be run when the Task is *done*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This method should only be used in low-level callback-based code.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       See the documentation of :meth:`Future.add_done_callback`
 | 
					
						
							|  |  |  |       for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: remove_done_callback(callback)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Remove *callback* from the callbacks list.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This method should only be used in low-level callback-based code.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       See the documentation of :meth:`Future.remove_done_callback`
 | 
					
						
							|  |  |  |       for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |    .. method:: get_stack(*, limit=None)
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Return the list of stack frames for this Task.
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       If the wrapped coroutine is not done, this returns the stack
 | 
					
						
							|  |  |  |       where it is suspended.  If the coroutine has completed
 | 
					
						
							|  |  |  |       successfully or was cancelled, this returns an empty list.
 | 
					
						
							|  |  |  |       If the coroutine was terminated by an exception, this returns
 | 
					
						
							|  |  |  |       the list of traceback frames.
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       The frames are always ordered from oldest to newest.
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Only one stack frame is returned for a suspended coroutine.
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       The optional *limit* argument sets the maximum number of frames
 | 
					
						
							|  |  |  |       to return; by default all available frames are returned.
 | 
					
						
							|  |  |  |       The ordering of the returned list differs depending on whether
 | 
					
						
							|  |  |  |       a stack or a traceback is returned: the newest frames of a
 | 
					
						
							|  |  |  |       stack are returned, but the oldest frames of a traceback are
 | 
					
						
							|  |  |  |       returned.  (This matches the behavior of the traceback module.)
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-16 22:37:28 -03:00
										 |  |  |    .. method:: print_stack(*, limit=None, file=None)
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Print the stack or traceback for this Task.
 | 
					
						
							| 
									
										
										
										
											2016-01-11 14:40:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       This produces output similar to that of the traceback module
 | 
					
						
							|  |  |  |       for the frames retrieved by :meth:`get_stack`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       The *limit* argument is passed to :meth:`get_stack` directly.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       The *file* argument is an I/O stream to which the output
 | 
					
						
							| 
									
										
										
										
											2023-02-07 22:04:31 +04:00
										 |  |  |       is written; by default output is written to :data:`sys.stdout`.
 | 
					
						
							| 
									
										
										
										
											2014-02-01 02:36:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-30 18:30:09 +03:00
										 |  |  |    .. method:: get_coro()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return the coroutine object wrapped by the :class:`Task`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.8
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-04 23:49:10 -07:00
										 |  |  |    .. method:: get_context()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return the :class:`contextvars.Context` object
 | 
					
						
							|  |  |  |       associated with the task.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.12
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. method:: get_name()
 | 
					
						
							| 
									
										
										
										
											2015-02-12 22:49:18 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Return the name of the Task.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       If no name has been explicitly assigned to the Task, the default
 | 
					
						
							|  |  |  |       asyncio Task implementation generates a default name during
 | 
					
						
							|  |  |  |       instantiation.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       .. versionadded:: 3.8
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. method:: set_name(value)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Set the name of the Task.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       The *value* argument can be any object, which is then
 | 
					
						
							|  |  |  |       converted to a string.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       In the default Task implementation, the name will be visible
 | 
					
						
							|  |  |  |       in the :func:`repr` output of a task object.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       .. versionadded:: 3.8
 | 
					
						
							| 
									
										
										
										
											2022-10-01 19:42:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. method:: cancel(msg=None)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Request the Task to be cancelled.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This arranges for a :exc:`CancelledError` exception to be thrown
 | 
					
						
							|  |  |  |       into the wrapped coroutine on the next cycle of the event loop.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The coroutine then has a chance to clean up or even deny the
 | 
					
						
							|  |  |  |       request by suppressing the exception with a :keyword:`try` ...
 | 
					
						
							|  |  |  |       ... ``except CancelledError`` ... :keyword:`finally` block.
 | 
					
						
							|  |  |  |       Therefore, unlike :meth:`Future.cancel`, :meth:`Task.cancel` does
 | 
					
						
							|  |  |  |       not guarantee that the Task will be cancelled, although
 | 
					
						
							|  |  |  |       suppressing cancellation completely is not common and is actively
 | 
					
						
							| 
									
										
										
										
											2023-03-22 17:52:10 +00:00
										 |  |  |       discouraged.  Should the coroutine nevertheless decide to suppress
 | 
					
						
							|  |  |  |       the cancellation, it needs to call :meth:`Task.uncancel` in addition
 | 
					
						
							|  |  |  |       to catching the exception.
 | 
					
						
							| 
									
										
										
										
											2022-10-01 19:42:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       .. versionchanged:: 3.9
 | 
					
						
							|  |  |  |          Added the *msg* parameter.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-06 17:30:27 -07:00
										 |  |  |       .. versionchanged:: 3.11
 | 
					
						
							|  |  |  |          The ``msg`` parameter is propagated from cancelled task to its awaiter.
 | 
					
						
							| 
									
										
										
										
											2022-10-01 19:42:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       .. _asyncio_example_task_cancel:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The following example illustrates how coroutines can intercept
 | 
					
						
							|  |  |  |       the cancellation request::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           async def cancel_me():
 | 
					
						
							|  |  |  |               print('cancel_me(): before sleep')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               try:
 | 
					
						
							|  |  |  |                   # Wait for 1 hour
 | 
					
						
							|  |  |  |                   await asyncio.sleep(3600)
 | 
					
						
							|  |  |  |               except asyncio.CancelledError:
 | 
					
						
							|  |  |  |                   print('cancel_me(): cancel sleep')
 | 
					
						
							|  |  |  |                   raise
 | 
					
						
							|  |  |  |               finally:
 | 
					
						
							|  |  |  |                   print('cancel_me(): after sleep')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           async def main():
 | 
					
						
							|  |  |  |               # Create a "cancel_me" Task
 | 
					
						
							|  |  |  |               task = asyncio.create_task(cancel_me())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               # Wait for 1 second
 | 
					
						
							|  |  |  |               await asyncio.sleep(1)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               task.cancel()
 | 
					
						
							|  |  |  |               try:
 | 
					
						
							|  |  |  |                   await task
 | 
					
						
							|  |  |  |               except asyncio.CancelledError:
 | 
					
						
							|  |  |  |                   print("main(): cancel_me is cancelled now")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           asyncio.run(main())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # Expected output:
 | 
					
						
							|  |  |  |           #
 | 
					
						
							|  |  |  |           #     cancel_me(): before sleep
 | 
					
						
							|  |  |  |           #     cancel_me(): cancel sleep
 | 
					
						
							|  |  |  |           #     cancel_me(): after sleep
 | 
					
						
							|  |  |  |           #     main(): cancel_me is cancelled now
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: cancelled()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return ``True`` if the Task is *cancelled*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The Task is *cancelled* when the cancellation was requested with
 | 
					
						
							|  |  |  |       :meth:`cancel` and the wrapped coroutine propagated the
 | 
					
						
							|  |  |  |       :exc:`CancelledError` exception thrown into it.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. method:: uncancel()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Decrement the count of cancellation requests to this Task.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Returns the remaining number of cancellation requests.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Note that once execution of a cancelled task completed, further
 | 
					
						
							|  |  |  |       calls to :meth:`uncancel` are ineffective.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This method is used by asyncio's internals and isn't expected to be
 | 
					
						
							|  |  |  |       used by end-user code.  In particular, if a Task gets successfully
 | 
					
						
							|  |  |  |       uncancelled, this allows for elements of structured concurrency like
 | 
					
						
							|  |  |  |       :ref:`taskgroups` and :func:`asyncio.timeout` to continue running,
 | 
					
						
							|  |  |  |       isolating cancellation to the respective structured block.
 | 
					
						
							|  |  |  |       For example::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         async def make_request_with_timeout():
 | 
					
						
							|  |  |  |             try:
 | 
					
						
							|  |  |  |                 async with asyncio.timeout(1):
 | 
					
						
							|  |  |  |                     # Structured block affected by the timeout:
 | 
					
						
							|  |  |  |                     await make_request()
 | 
					
						
							|  |  |  |                     await make_another_request()
 | 
					
						
							|  |  |  |             except TimeoutError:
 | 
					
						
							|  |  |  |                 log("There was a timeout")
 | 
					
						
							|  |  |  |             # Outer code not affected by the timeout:
 | 
					
						
							|  |  |  |             await unrelated_code()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       While the block with ``make_request()`` and ``make_another_request()``
 | 
					
						
							|  |  |  |       might get cancelled due to the timeout, ``unrelated_code()`` should
 | 
					
						
							|  |  |  |       continue running even in case of the timeout.  This is implemented
 | 
					
						
							|  |  |  |       with :meth:`uncancel`.  :class:`TaskGroup` context managers use
 | 
					
						
							|  |  |  |       :func:`uncancel` in a similar fashion.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-22 17:52:10 +00:00
										 |  |  |       If end-user code is, for some reason, suppresing cancellation by
 | 
					
						
							|  |  |  |       catching :exc:`CancelledError`, it needs to call this method to remove
 | 
					
						
							|  |  |  |       the cancellation state.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 19:42:36 +02:00
										 |  |  |    .. method:: cancelling()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Return the number of pending cancellation requests to this Task, i.e.,
 | 
					
						
							|  |  |  |       the number of calls to :meth:`cancel` less the number of
 | 
					
						
							|  |  |  |       :meth:`uncancel` calls.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Note that if this number is greater than zero but the Task is
 | 
					
						
							|  |  |  |       still executing, :meth:`cancelled` will still return ``False``.
 | 
					
						
							|  |  |  |       This is because this number can be lowered by calling :meth:`uncancel`,
 | 
					
						
							|  |  |  |       which can lead to the task not being cancelled after all if the
 | 
					
						
							|  |  |  |       cancellation requests go down to zero.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This method is used by asyncio's internals and isn't expected to be
 | 
					
						
							|  |  |  |       used by end-user code.  See :meth:`uncancel` for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.11
 |