| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Coroutines declared with async/await syntax is the preferred way of
 | 
					
						
							|  |  |  | writing asyncio applications.  For example, the following snippet
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | of code prints "hello", waits 1 second, 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | To actually run a coroutine asyncio provides three main 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():
 | 
					
						
							|  |  |  |           print('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-09-14 13:32:07 -07:00
										 |  |  |           print('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'))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           print('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-09-14 13:32:07 -07:00
										 |  |  |           print('finished at', time.strftime('%X'))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   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
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Note that 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*: object returned by calling a
 | 
					
						
							|  |  |  |   *coroutine function*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Running an asyncio Program
 | 
					
						
							|  |  |  | ==========================
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-19 23:15:06 -04:00
										 |  |  | .. function:: run(coro, \*, debug=False)
 | 
					
						
							| 
									
										
										
										
											2017-12-14 09:42:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     This function runs the passed coroutine, taking care of
 | 
					
						
							|  |  |  |     managing the asyncio event loop and finalizing asynchronous
 | 
					
						
							|  |  |  |     generators.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This function cannot be called when another asyncio event loop is
 | 
					
						
							|  |  |  |     running in the same thread.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |     If *debug* is ``True``, the event loop will be run in debug mode.
 | 
					
						
							| 
									
										
										
										
											2017-12-14 09:42:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     This function always creates a new event loop and closes it at
 | 
					
						
							|  |  |  |     the end.  It should be used as a main entry point for asyncio
 | 
					
						
							|  |  |  |     programs, and should ideally only be called once.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     .. versionadded:: 3.7
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |        **Important:** this function has been added to asyncio in
 | 
					
						
							|  |  |  |        Python 3.7 on a :term:`provisional basis <provisional api>`.
 | 
					
						
							| 
									
										
										
										
											2017-12-14 09:42:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Creating Tasks
 | 
					
						
							|  |  |  | ==============
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. function:: create_task(coro, \*, name=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Wrap the *coro* :ref:`coroutine <coroutine>` into a task and schedule
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    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`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.7
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. versionchanged:: 3.8
 | 
					
						
							|  |  |  |       Added the ``name`` parameter.
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Sleeping
 | 
					
						
							|  |  |  | ========
 | 
					
						
							| 
									
										
										
										
											2014-10-15 18:49:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. coroutinefunction:: sleep(delay, result=None, \*, loop=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-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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Running Tasks Concurrently
 | 
					
						
							|  |  |  | ==========================
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 15:35:24 -04:00
										 |  |  | .. function:: gather(\*fs, loop=None, return_exceptions=False)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Return a Future aggregating results from the given coroutine objects,
 | 
					
						
							|  |  |  |    Tasks, or Futures.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If all Tasks/Futures are completed successfully, the result is an
 | 
					
						
							|  |  |  |    aggregate list of returned values.  The result values are in the
 | 
					
						
							|  |  |  |    order of the original *fs* sequence.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    All coroutines in the *fs* list are automatically
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    scheduled as :class:`Tasks <Task>`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If *return_exceptions* is ``True``, exceptions in the Tasks/Futures
 | 
					
						
							|  |  |  |    are treated the same as successful results, and gathered in the
 | 
					
						
							|  |  |  |    result list.  Otherwise, the first raised exception is immediately
 | 
					
						
							|  |  |  |    propagated to the returned Future.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If the outer Future is *cancelled*, all submitted Tasks/Futures
 | 
					
						
							|  |  |  |    (that have not completed yet) are also *cancelled*.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If any child is *cancelled*, it is treated as if it raised
 | 
					
						
							|  |  |  |    :exc:`CancelledError` -- the outer Future 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.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    All futures must share the same event loop.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 19:17:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. versionchanged:: 3.7
 | 
					
						
							|  |  |  |       If the *gather* itself is cancelled, the cancellation is
 | 
					
						
							|  |  |  |       propagated regardless of *return_exceptions*.
 | 
					
						
							| 
									
										
										
										
											2017-12-23 15:04:15 -05: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):
 | 
					
						
							|  |  |  |               print(f"Task {name}: Compute factorial({i})...")
 | 
					
						
							|  |  |  |               await asyncio.sleep(1)
 | 
					
						
							|  |  |  |               f *= i
 | 
					
						
							|  |  |  |           print(f"Task {name}: factorial({number}) = {f}")
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       async def main():
 | 
					
						
							|  |  |  |           await asyncio.gather(
 | 
					
						
							|  |  |  |               factorial("A", 2),
 | 
					
						
							|  |  |  |               factorial("B", 3),
 | 
					
						
							|  |  |  |               factorial("C", 4),
 | 
					
						
							|  |  |  |           ))
 | 
					
						
							| 
									
										
										
										
											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:
 | 
					
						
							|  |  |  |       #
 | 
					
						
							|  |  |  |       #     Task A: Compute factorial(2)...
 | 
					
						
							|  |  |  |       #     Task B: Compute factorial(2)...
 | 
					
						
							|  |  |  |       #     Task C: Compute factorial(2)...
 | 
					
						
							|  |  |  |       #     Task A: factorial(2) = 2
 | 
					
						
							|  |  |  |       #     Task B: Compute factorial(3)...
 | 
					
						
							|  |  |  |       #     Task C: Compute factorial(3)...
 | 
					
						
							|  |  |  |       #     Task B: factorial(3) = 6
 | 
					
						
							|  |  |  |       #     Task C: Compute factorial(4)...
 | 
					
						
							|  |  |  |       #     Task C: factorial(4) = 24
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Shielding Tasks From Cancellation
 | 
					
						
							|  |  |  | =================================
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. coroutinefunction:: shield(fut, \*, loop=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Wait for a Future/Task while protecting it from being cancelled.
 | 
					
						
							| 
									
										
										
										
											2013-12-10 02:09:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    *fut* can be a coroutine, a Task, or a Future-like object.  If
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *fut* is a coroutine it is automatically scheduled as a
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    :class:`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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |        res = await shield(something())
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |        try:
 | 
					
						
							|  |  |  |            res = await shield(something())
 | 
					
						
							|  |  |  |        except CancelledError:
 | 
					
						
							|  |  |  |            res = None
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. coroutinefunction:: wait_for(fut, timeout, \*, loop=None)
 | 
					
						
							| 
									
										
										
										
											2017-12-15 07:04:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Wait for a coroutine, Task, or Future to complete with timeout.
 | 
					
						
							| 
									
										
										
										
											2017-12-15 07:04:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    *fut* can be a coroutine, a Task, or a Future-like object.  If
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    *fut* is a coroutine it is automatically scheduled as a
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    :class:`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
 | 
					
						
							|  |  |  |    :exc:`asyncio.TimeoutError`.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    To avoid the task cancellation, 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,
 | 
					
						
							|  |  |  |    so the total wait time may exceed the *timeout*.
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    If the wait is cancelled, the future *fut* is also cancelled.
 | 
					
						
							| 
									
										
										
										
											2014-07-08 12:39:10 +02: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)
 | 
					
						
							|  |  |  |            except asyncio.TimeoutError:
 | 
					
						
							|  |  |  |                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-14 13:32:07 -07:00
										 |  |  |       When *fut* is cancelled due to a timeout, ``wait_for`` waits
 | 
					
						
							|  |  |  |       for *fut* to be cancelled.  Previously, it raised
 | 
					
						
							|  |  |  |       :exc:`asyncio.TimeoutError` immediately.
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03: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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. coroutinefunction:: wait(fs, \*, loop=None, timeout=None,\
 | 
					
						
							|  |  |  |                             return_when=ALL_COMPLETED)
 | 
					
						
							| 
									
										
										
										
											2014-06-02 23:06:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Wait for a set of coroutines, Tasks, or Futures to complete.
 | 
					
						
							| 
									
										
										
										
											2014-06-02 23:06:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    *fs* is a list of coroutines, Futures, and/or Tasks.  Coroutines
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    are automatically scheduled as :class:`Tasks <Task>`.
 | 
					
						
							| 
									
										
										
										
											2014-06-02 23:06:46 +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-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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Note that this function does not raise :exc:`asyncio.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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Usage::
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |         done, pending = await asyncio.wait(fs)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. function:: as_completed(fs, \*, loop=None, timeout=None)
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    Return an iterator of awaitables which return
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    :class:`Future` instances.
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Raises :exc:`asyncio.TimeoutError` if the timeout occurs before
 | 
					
						
							|  |  |  |    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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |        for f in as_completed(fs):
 | 
					
						
							|  |  |  |            result = await f
 | 
					
						
							|  |  |  |            # ...
 | 
					
						
							| 
									
										
										
										
											2018-08-09 00:06:47 +03: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-14 13:32:07 -07:00
										 |  |  |    Return a :class:`concurrent.futures.Future` to access the result.
 | 
					
						
							| 
									
										
										
										
											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)
 | 
					
						
							|  |  |  |      except asyncio.TimeoutError:
 | 
					
						
							|  |  |  |          print('The coroutine took too long, cancelling the task...')
 | 
					
						
							|  |  |  |          future.cancel()
 | 
					
						
							|  |  |  |      except Exception as exc:
 | 
					
						
							|  |  |  |          print('The coroutine raised an exception: {!r}'.format(exc))
 | 
					
						
							|  |  |  |      else:
 | 
					
						
							|  |  |  |          print('The coroutine returned: {!r}'.format(result))
 | 
					
						
							| 
									
										
										
										
											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-09-14 13:32:07 -07:00
										 |  |  |    Unlike other asyncio functions this functions requires the *loop*
 | 
					
						
							|  |  |  |    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
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Task Object
 | 
					
						
							|  |  |  | ===========
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. class:: Task(coro, \*, loop=None, name=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    A :class:`Future`-like object that wraps a Python
 | 
					
						
							|  |  |  |    :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
 | 
					
						
							|  |  |  |       Added the ``name`` parameter.
 | 
					
						
							| 
									
										
										
										
											2015-12-15 00:45:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. method:: cancel()
 | 
					
						
							| 
									
										
										
										
											2017-12-15 07:04:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Request the Task to be cancelled.
 | 
					
						
							| 
									
										
										
										
											2017-12-15 07:04:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       This arranges for a :exc:`CancelledError` exception to be thrown
 | 
					
						
							|  |  |  |       into the wrapped coroutine on the next cycle of the event loop.
 | 
					
						
							| 
									
										
										
										
											2014-08-11 01:11:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       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
 | 
					
						
							|  |  |  |       discouraged.
 | 
					
						
							| 
									
										
										
										
											2014-08-11 01:11:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 15:11:24 -07:00
										 |  |  |       .. _asyncio_example_task_cancel:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       The following example illustrates how coroutines can intercept
 | 
					
						
							|  |  |  |       the cancellation request::
 | 
					
						
							| 
									
										
										
										
											2017-06-09 14:28:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |           async def cancel_me():
 | 
					
						
							|  |  |  |               print('cancel_me(): before sleep')
 | 
					
						
							| 
									
										
										
										
											2017-06-09 14:28:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |               try:
 | 
					
						
							|  |  |  |                   # Wait for 1 hour
 | 
					
						
							|  |  |  |                   await asyncio.sleep(3600)
 | 
					
						
							|  |  |  |               except asyncio.CancelledError:
 | 
					
						
							|  |  |  |                   print('cancel_me(): cancel sleep')
 | 
					
						
							|  |  |  |                   raise
 | 
					
						
							|  |  |  |               finally:
 | 
					
						
							|  |  |  |                   print('cancel_me(): after sleep')
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |           async def main():
 | 
					
						
							|  |  |  |               # Create a "cancel_me" Task
 | 
					
						
							|  |  |  |               task = asyncio.create_task(cancel_me())
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |               # Wait for 1 second
 | 
					
						
							|  |  |  |               await asyncio.sleep(1)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |               task.cancel()
 | 
					
						
							|  |  |  |               try:
 | 
					
						
							|  |  |  |                   await task
 | 
					
						
							|  |  |  |               except asyncio.CancelledError:
 | 
					
						
							|  |  |  |                   print("main(): cancel_me is cancelled now")
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |           asyncio.run(main())
 | 
					
						
							| 
									
										
										
										
											2018-05-29 17:20:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |           # Expected output:
 | 
					
						
							|  |  |  |           #
 | 
					
						
							|  |  |  |           #     cancel_me(): before sleep
 | 
					
						
							|  |  |  |           #     cancel_me(): cancel sleep
 | 
					
						
							|  |  |  |           #     cancel_me(): after sleep
 | 
					
						
							|  |  |  |           #     main(): cancel_me is cancelled now
 | 
					
						
							| 
									
										
										
										
											2014-01-30 00:18:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. method:: cancelled()
 | 
					
						
							| 
									
										
										
										
											2014-01-30 00:18:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Return ``True`` if the Task is *cancelled*.
 | 
					
						
							| 
									
										
										
										
											2014-01-30 00:18:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       The Task is *cancelled* when the cancellation was requested with
 | 
					
						
							|  |  |  |       :meth:`cancel` and the wrapped coroutine propagated the
 | 
					
						
							|  |  |  |       :exc:`CancelledError` exception thrown into it.
 | 
					
						
							| 
									
										
										
										
											2014-01-30 00:18:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-14 13:32:07 -07: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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07: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
 | 
					
						
							|  |  |  |       is written; by default output is written to :data:`sys.stderr`.
 | 
					
						
							| 
									
										
										
										
											2014-02-01 02:36:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. classmethod:: all_tasks(loop=None)
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Return a set of all tasks for an event loop.
 | 
					
						
							| 
									
										
										
										
											2016-05-16 16:23:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       By default all tasks for the current event loop are returned.
 | 
					
						
							|  |  |  |       If *loop* is ``None``, the :func:`get_event_loop` function
 | 
					
						
							|  |  |  |       is used to get the current loop.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       This method is **deprecated** and will be removed in
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Python 3.9.  Use the :func:`all_tasks` function instead.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    .. classmethod:: current_task(loop=None)
 | 
					
						
							| 
									
										
										
										
											2014-06-10 11:16:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Return the currently running task or ``None``.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       If *loop* is ``None``, the :func:`get_event_loop` function
 | 
					
						
							|  |  |  |       is used to get the current loop.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |       This method is **deprecated** and will be removed in
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |       Python 3.9.  Use the :func:`current_task` function instead.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. _asyncio_generator_based_coro:
 | 
					
						
							| 
									
										
										
										
											2018-05-29 18:21:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Generator-based Coroutines
 | 
					
						
							|  |  |  | ==========================
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. note::
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Support for generator-based coroutines is **deprecated** and
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  |    is scheduled for removal in Python 4.0.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Generator-based coroutines predate async/await syntax.  They are
 | 
					
						
							| 
									
										
										
										
											2018-09-17 19:16:44 -04:00
										 |  |  | Python generators that use ``yield from`` expressions to await
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | on Futures and other coroutines.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | Generator-based coroutines should be decorated with
 | 
					
						
							|  |  |  | :func:`@asyncio.coroutine <asyncio.coroutine>`, although this is not
 | 
					
						
							|  |  |  | enforced.
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:08:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-03 01:22:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. decorator:: coroutine
 | 
					
						
							| 
									
										
										
										
											2014-01-30 00:18:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |     Decorator to mark generator-based coroutines.
 | 
					
						
							| 
									
										
										
										
											2014-01-30 00:18:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |     This decorator enables legacy generator-based coroutines to be
 | 
					
						
							|  |  |  |     compatible with async/await code::
 | 
					
						
							| 
									
										
										
										
											2014-01-30 00:18:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |         @asyncio.coroutine
 | 
					
						
							|  |  |  |         def old_style_coroutine():
 | 
					
						
							|  |  |  |             yield from asyncio.sleep(1)
 | 
					
						
							| 
									
										
										
										
											2014-01-30 00:18:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |         async def main():
 | 
					
						
							|  |  |  |             await old_style_coroutine()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This decorator is **deprecated** and is scheduled for removal in
 | 
					
						
							|  |  |  |     Python 4.0.
 | 
					
						
							| 
									
										
										
										
											2015-04-03 17:08:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |     This decorator should not be used for :keyword:`async def`
 | 
					
						
							|  |  |  |     coroutines.
 | 
					
						
							| 
									
										
										
										
											2014-01-30 00:18:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  | .. function:: iscoroutine(obj)
 | 
					
						
							| 
									
										
										
										
											2014-01-30 00:18:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    Return ``True`` if *obj* is a :ref:`coroutine object <coroutine>`.
 | 
					
						
							| 
									
										
										
										
											2018-05-29 17:31:01 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-14 13:32:07 -07:00
										 |  |  |    This method is different from :func:`inspect.iscoroutine` because
 | 
					
						
							|  |  |  |    it returns ``True`` for generator-based coroutines decorated with
 | 
					
						
							|  |  |  |    :func:`@coroutine <coroutine>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: iscoroutinefunction(func)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Return ``True`` if *func* is a :ref:`coroutine function
 | 
					
						
							|  |  |  |    <coroutine>`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This method is different from :func:`inspect.iscoroutinefunction`
 | 
					
						
							|  |  |  |    because it returns ``True`` for generator-based coroutine functions
 | 
					
						
							|  |  |  |    decorated with :func:`@coroutine <coroutine>`.
 |