blob: 69e965cfc1d2d3a46ca1edb770fa608d92214be4 [file] [log] [blame]
R David Murray6a143812013-12-20 14:37:39 -05001.. currentmodule:: asyncio
Victor Stinnerea3183f2013-12-03 01:08:00 +01002
Yury Selivanov3faaa882018-09-14 13:32:07 -07003
4====================
5Coroutines and Tasks
Victor Stinnerea3183f2013-12-03 01:08:00 +01006====================
7
Yury Selivanov3faaa882018-09-14 13:32:07 -07008This section outlines high-level asyncio APIs to work with coroutines
9and Tasks.
lf627d2c82017-07-25 17:03:51 -060010
Yury Selivanov3faaa882018-09-14 13:32:07 -070011.. contents::
12 :depth: 1
13 :local:
14
lf627d2c82017-07-25 17:03:51 -060015
Victor Stinnerea3183f2013-12-03 01:08:00 +010016.. _coroutine:
17
18Coroutines
Yury Selivanov3faaa882018-09-14 13:32:07 -070019==========
Victor Stinnerea3183f2013-12-03 01:08:00 +010020
Kyle Stanleyf9000642019-10-10 19:18:46 -040021:term:`Coroutines <coroutine>` declared with the async/await syntax is the
22preferred way of writing asyncio applications. For example, the following
23snippet of code (requires Python 3.7+) prints "hello", waits 1 second,
Yury Selivanovb042cf12018-09-18 02:47:54 -040024and then prints "world"::
Victor Stinnerea3183f2013-12-03 01:08:00 +010025
Yury Selivanov3faaa882018-09-14 13:32:07 -070026 >>> import asyncio
Victor Stinnerea3183f2013-12-03 01:08:00 +010027
Yury Selivanov3faaa882018-09-14 13:32:07 -070028 >>> async def main():
29 ... print('hello')
30 ... await asyncio.sleep(1)
31 ... print('world')
Victor Stinnerea3183f2013-12-03 01:08:00 +010032
Yury Selivanov3faaa882018-09-14 13:32:07 -070033 >>> asyncio.run(main())
34 hello
35 world
Victor Stinnerea3183f2013-12-03 01:08:00 +010036
Yury Selivanov3faaa882018-09-14 13:32:07 -070037Note that simply calling a coroutine will not schedule it to
38be executed::
Victor Stinnerea3183f2013-12-03 01:08:00 +010039
Yury Selivanov3faaa882018-09-14 13:32:07 -070040 >>> main()
41 <coroutine object main at 0x1053bb7c8>
Victor Stinnerea3183f2013-12-03 01:08:00 +010042
Boštjan Mejak1d5bdef2019-05-19 11:01:36 +020043To actually run a coroutine, asyncio provides three main mechanisms:
Victor Stinnerea3183f2013-12-03 01:08:00 +010044
Elvis Pranskevichus1fa2ec42018-09-17 19:16:44 -040045* The :func:`asyncio.run` function to run the top-level
Yury Selivanov3faaa882018-09-14 13:32:07 -070046 entry point "main()" function (see the above example.)
Victor Stinnerea3183f2013-12-03 01:08:00 +010047
Elvis Pranskevichus1fa2ec42018-09-17 19:16:44 -040048* Awaiting on a coroutine. The following snippet of code will
Yury Selivanov3faaa882018-09-14 13:32:07 -070049 print "hello" after waiting for 1 second, and then print "world"
50 after waiting for *another* 2 seconds::
Victor Stinnerea3183f2013-12-03 01:08:00 +010051
Yury Selivanov3faaa882018-09-14 13:32:07 -070052 import asyncio
53 import time
Victor Stinnerea3183f2013-12-03 01:08:00 +010054
Yury Selivanov3faaa882018-09-14 13:32:07 -070055 async def say_after(delay, what):
56 await asyncio.sleep(delay)
57 print(what)
58
59 async def main():
Mariatta9f43fbb2018-10-24 15:37:12 -070060 print(f"started at {time.strftime('%X')}")
Yury Selivanov3faaa882018-09-14 13:32:07 -070061
62 await say_after(1, 'hello')
63 await say_after(2, 'world')
64
Mariatta9f43fbb2018-10-24 15:37:12 -070065 print(f"finished at {time.strftime('%X')}")
Yury Selivanov3faaa882018-09-14 13:32:07 -070066
67 asyncio.run(main())
68
69 Expected output::
70
71 started at 17:13:52
72 hello
73 world
74 finished at 17:13:55
75
Elvis Pranskevichus1fa2ec42018-09-17 19:16:44 -040076* The :func:`asyncio.create_task` function to run coroutines
Yury Selivanov3faaa882018-09-14 13:32:07 -070077 concurrently as asyncio :class:`Tasks <Task>`.
78
Danny Hermes7bfbda42018-09-17 21:49:21 -070079 Let's modify the above example and run two ``say_after`` coroutines
Yury Selivanov3faaa882018-09-14 13:32:07 -070080 *concurrently*::
81
82 async def main():
83 task1 = asyncio.create_task(
84 say_after(1, 'hello'))
85
86 task2 = asyncio.create_task(
87 say_after(2, 'world'))
88
Mariatta9f43fbb2018-10-24 15:37:12 -070089 print(f"started at {time.strftime('%X')}")
Yury Selivanov3faaa882018-09-14 13:32:07 -070090
91 # Wait until both tasks are completed (should take
92 # around 2 seconds.)
93 await task1
94 await task2
95
Mariatta9f43fbb2018-10-24 15:37:12 -070096 print(f"finished at {time.strftime('%X')}")
Yury Selivanov3faaa882018-09-14 13:32:07 -070097
98 Note that expected output now shows that the snippet runs
99 1 second faster than before::
100
101 started at 17:14:32
102 hello
103 world
104 finished at 17:14:34
105
Yury Selivanov47150392018-09-18 17:55:44 -0400106
107.. _asyncio-awaitables:
108
109Awaitables
110==========
111
Yury Selivanove247b462018-09-20 12:43:59 -0400112We say that an object is an **awaitable** object if it can be used
113in an :keyword:`await` expression. Many asyncio APIs are designed to
114accept awaitables.
115
116There are three main types of *awaitable* objects:
117**coroutines**, **Tasks**, and **Futures**.
Yury Selivanov47150392018-09-18 17:55:44 -0400118
119
Yury Selivanove247b462018-09-20 12:43:59 -0400120.. rubric:: Coroutines
Yury Selivanov47150392018-09-18 17:55:44 -0400121
Yury Selivanove247b462018-09-20 12:43:59 -0400122Python coroutines are *awaitables* and therefore can be awaited from
123other coroutines::
124
125 import asyncio
Yury Selivanov47150392018-09-18 17:55:44 -0400126
127 async def nested():
128 return 42
129
130 async def main():
Yury Selivanove247b462018-09-20 12:43:59 -0400131 # Nothing happens if we just call "nested()".
Yury Selivanovdb1a80e2018-09-21 16:23:15 -0400132 # A coroutine object is created but not awaited,
133 # so it *won't run at all*.
Yury Selivanove247b462018-09-20 12:43:59 -0400134 nested()
135
136 # Let's do it differently now and await it:
137 print(await nested()) # will print "42".
138
139 asyncio.run(main())
140
141.. important::
142
143 In this documentation the term "coroutine" can be used for
144 two closely related concepts:
145
146 * a *coroutine function*: an :keyword:`async def` function;
147
148 * a *coroutine object*: an object returned by calling a
149 *coroutine function*.
150
151asyncio also supports legacy :ref:`generator-based
152<asyncio_generator_based_coro>` coroutines.
153
154
155.. rubric:: Tasks
Yury Selivanov47150392018-09-18 17:55:44 -0400156
157*Tasks* are used to schedule coroutines *concurrently*.
Yury Selivanov47150392018-09-18 17:55:44 -0400158
Yury Selivanove247b462018-09-20 12:43:59 -0400159When a coroutine is wrapped into a *Task* with functions like
160:func:`asyncio.create_task` the coroutine is automatically
161scheduled to run soon::
Yury Selivanov3faaa882018-09-14 13:32:07 -0700162
Yury Selivanove247b462018-09-20 12:43:59 -0400163 import asyncio
Yury Selivanov3faaa882018-09-14 13:32:07 -0700164
Yury Selivanove247b462018-09-20 12:43:59 -0400165 async def nested():
166 return 42
167
168 async def main():
169 # Schedule nested() to run soon concurrently
170 # with "main()".
171 task = asyncio.create_task(nested())
172
173 # "task" can now be used to cancel "nested()", or
174 # can simply be awaited to wait until it is complete:
175 await task
176
177 asyncio.run(main())
Victor Stinner337e03f2014-08-11 01:11:13 +0200178
Victor Stinnerea3183f2013-12-03 01:08:00 +0100179
Yury Selivanov47150392018-09-18 17:55:44 -0400180.. rubric:: Futures
181
Yury Selivanove247b462018-09-20 12:43:59 -0400182A :class:`Future` is a special **low-level** awaitable object that
183represents an **eventual result** of an asynchronous operation.
Yury Selivanov47150392018-09-18 17:55:44 -0400184
Yury Selivanove247b462018-09-20 12:43:59 -0400185When a Future object is *awaited* it means that the coroutine will
186wait until the Future is resolved in some other place.
187
Yury Selivanov47150392018-09-18 17:55:44 -0400188Future objects in asyncio are needed to allow callback-based code
189to be used with async/await.
190
Yury Selivanove247b462018-09-20 12:43:59 -0400191Normally **there is no need** to create Future objects at the
Yury Selivanov47150392018-09-18 17:55:44 -0400192application level code.
193
194Future objects, sometimes exposed by libraries and some asyncio
Yury Selivanove247b462018-09-20 12:43:59 -0400195APIs, can be awaited::
Yury Selivanov47150392018-09-18 17:55:44 -0400196
197 async def main():
198 await function_that_returns_a_future_object()
199
200 # this is also valid:
201 await asyncio.gather(
202 function_that_returns_a_future_object(),
203 some_python_coroutine()
204 )
205
Yury Selivanove247b462018-09-20 12:43:59 -0400206A good example of a low-level function that returns a Future object
207is :meth:`loop.run_in_executor`.
208
Yury Selivanov47150392018-09-18 17:55:44 -0400209
Yury Selivanov3faaa882018-09-14 13:32:07 -0700210Running an asyncio Program
211==========================
Victor Stinnerea3183f2013-12-03 01:08:00 +0100212
Andre Delfinodcc997c2020-12-16 22:37:28 -0300213.. function:: run(coro, *, debug=False)
Yury Selivanov02a0a192017-12-14 09:42:21 -0500214
Kyle Stanleye4070132019-09-30 20:12:21 -0400215 Execute the :term:`coroutine` *coro* and return the result.
216
Yury Selivanov02a0a192017-12-14 09:42:21 -0500217 This function runs the passed coroutine, taking care of
Kyle Stanley9fdc64c2019-09-19 08:47:22 -0400218 managing the asyncio event loop, *finalizing asynchronous
219 generators*, and closing the threadpool.
Yury Selivanov02a0a192017-12-14 09:42:21 -0500220
221 This function cannot be called when another asyncio event loop is
222 running in the same thread.
223
Yury Selivanov3faaa882018-09-14 13:32:07 -0700224 If *debug* is ``True``, the event loop will be run in debug mode.
Yury Selivanov02a0a192017-12-14 09:42:21 -0500225
226 This function always creates a new event loop and closes it at
227 the end. It should be used as a main entry point for asyncio
228 programs, and should ideally only be called once.
229
Emmanuel Arias17deb162019-09-25 05:53:49 -0300230 Example::
231
232 async def main():
233 await asyncio.sleep(1)
234 print('hello')
235
236 asyncio.run(main())
237
Yury Selivanov02a0a192017-12-14 09:42:21 -0500238 .. versionadded:: 3.7
239
Kyle Stanley9fdc64c2019-09-19 08:47:22 -0400240 .. versionchanged:: 3.9
241 Updated to use :meth:`loop.shutdown_default_executor`.
Yury Selivanov02a0a192017-12-14 09:42:21 -0500242
Kyle Stanleyf9000642019-10-10 19:18:46 -0400243 .. note::
244 The source code for ``asyncio.run()`` can be found in
245 :source:`Lib/asyncio/runners.py`.
246
Yury Selivanov3faaa882018-09-14 13:32:07 -0700247Creating Tasks
248==============
Victor Stinnerea3183f2013-12-03 01:08:00 +0100249
Andre Delfinodcc997c2020-12-16 22:37:28 -0300250.. function:: create_task(coro, *, name=None)
Andrew Svetlovf74ef452017-12-15 07:04:38 +0200251
Yury Selivanove247b462018-09-20 12:43:59 -0400252 Wrap the *coro* :ref:`coroutine <coroutine>` into a :class:`Task`
253 and schedule its execution. Return the Task object.
Alex Grönholmcca4eec2018-08-09 00:06:47 +0300254
255 If *name* is not ``None``, it is set as the name of the task using
256 :meth:`Task.set_name`.
Andrew Svetlovf74ef452017-12-15 07:04:38 +0200257
Elvis Pranskevichus1fa2ec42018-09-17 19:16:44 -0400258 The task is executed in the loop returned by :func:`get_running_loop`,
Andrew Svetlovf74ef452017-12-15 07:04:38 +0200259 :exc:`RuntimeError` is raised if there is no running loop in
260 current thread.
261
Yury Selivanov47150392018-09-18 17:55:44 -0400262 This function has been **added in Python 3.7**. Prior to
263 Python 3.7, the low-level :func:`asyncio.ensure_future` function
264 can be used instead::
265
266 async def coro():
267 ...
268
269 # In Python 3.7+
270 task = asyncio.create_task(coro())
271 ...
272
273 # This works in all Python versions but is less readable
274 task = asyncio.ensure_future(coro())
275 ...
276
Andrew Svetlovf74ef452017-12-15 07:04:38 +0200277 .. versionadded:: 3.7
278
Alex Grönholmcca4eec2018-08-09 00:06:47 +0300279 .. versionchanged:: 3.8
280 Added the ``name`` parameter.
281
Victor Stinnerea3183f2013-12-03 01:08:00 +0100282
Yury Selivanov3faaa882018-09-14 13:32:07 -0700283Sleeping
284========
Andrew Svetlovf1240162016-01-11 14:40:35 +0200285
Yurii Karabas86150d32020-11-29 14:50:57 +0200286.. coroutinefunction:: sleep(delay, result=None)
Victor Stinnerea3183f2013-12-03 01:08:00 +0100287
Yury Selivanov3faaa882018-09-14 13:32:07 -0700288 Block for *delay* seconds.
289
290 If *result* is provided, it is returned to the caller
Eli Bendersky2d26af82014-01-20 06:59:23 -0800291 when the coroutine completes.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100292
Hrvoje Nikšićcd602b82018-10-01 12:09:38 +0200293 ``sleep()`` always suspends the current task, allowing other tasks
294 to run.
295
Simon Willison5c301452021-01-06 18:03:18 -0800296 Setting the delay to 0 provides an optimized path to allow other
297 tasks to run. This can be used by long-running functions to avoid
298 blocking the event loop for the full duration of the function call.
299
Yury Selivanov7372c3b2018-09-14 15:11:24 -0700300 .. _asyncio_example_sleep:
Victor Stinner45b27ed2014-02-01 02:36:43 +0100301
Yury Selivanov3faaa882018-09-14 13:32:07 -0700302 Example of coroutine displaying the current date every second
Elvis Pranskevichus1fa2ec42018-09-17 19:16:44 -0400303 for 5 seconds::
Victor Stinnerbdd574d2015-02-12 22:49:18 +0100304
Yury Selivanov3faaa882018-09-14 13:32:07 -0700305 import asyncio
306 import datetime
Victor Stinnerea3183f2013-12-03 01:08:00 +0100307
Yury Selivanov3faaa882018-09-14 13:32:07 -0700308 async def display_date():
309 loop = asyncio.get_running_loop()
310 end_time = loop.time() + 5.0
311 while True:
312 print(datetime.datetime.now())
313 if (loop.time() + 1.0) >= end_time:
314 break
315 await asyncio.sleep(1)
316
317 asyncio.run(display_date())
318
319
320Running Tasks Concurrently
321==========================
322
Andre Delfinodcc997c2020-12-16 22:37:28 -0300323.. awaitablefunction:: gather(*aws, return_exceptions=False)
Yury Selivanov3faaa882018-09-14 13:32:07 -0700324
Yury Selivanove247b462018-09-20 12:43:59 -0400325 Run :ref:`awaitable objects <asyncio-awaitables>` in the *aws*
Yury Selivanov47150392018-09-18 17:55:44 -0400326 sequence *concurrently*.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700327
Yury Selivanove247b462018-09-20 12:43:59 -0400328 If any awaitable in *aws* is a coroutine, it is automatically
Yury Selivanov47150392018-09-18 17:55:44 -0400329 scheduled as a Task.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700330
Yury Selivanov47150392018-09-18 17:55:44 -0400331 If all awaitables are completed successfully, the result is an
332 aggregate list of returned values. The order of result values
Yury Selivanove247b462018-09-20 12:43:59 -0400333 corresponds to the order of awaitables in *aws*.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700334
Yury Selivanovdb1a80e2018-09-21 16:23:15 -0400335 If *return_exceptions* is ``False`` (default), the first
336 raised exception is immediately propagated to the task that
337 awaits on ``gather()``. Other awaitables in the *aws* sequence
338 **won't be cancelled** and will continue to run.
339
Yury Selivanov47150392018-09-18 17:55:44 -0400340 If *return_exceptions* is ``True``, exceptions are treated the
341 same as successful results, and aggregated in the result list.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700342
Yury Selivanovdb1a80e2018-09-21 16:23:15 -0400343 If ``gather()`` is *cancelled*, all submitted awaitables
Yury Selivanov3faaa882018-09-14 13:32:07 -0700344 (that have not completed yet) are also *cancelled*.
345
Yury Selivanove247b462018-09-20 12:43:59 -0400346 If any Task or Future from the *aws* sequence is *cancelled*, it is
Yury Selivanov47150392018-09-18 17:55:44 -0400347 treated as if it raised :exc:`CancelledError` -- the ``gather()``
348 call is **not** cancelled in this case. This is to prevent the
349 cancellation of one submitted Task/Future to cause other
350 Tasks/Futures to be cancelled.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700351
Yury Selivanov7372c3b2018-09-14 15:11:24 -0700352 .. _asyncio_example_gather:
353
Yury Selivanov3faaa882018-09-14 13:32:07 -0700354 Example::
355
356 import asyncio
357
358 async def factorial(name, number):
359 f = 1
360 for i in range(2, number + 1):
Miss Islington (bot)46426972021-05-13 23:07:20 -0700361 print(f"Task {name}: Compute factorial({number}), currently i={i}...")
Yury Selivanov3faaa882018-09-14 13:32:07 -0700362 await asyncio.sleep(1)
363 f *= i
364 print(f"Task {name}: factorial({number}) = {f}")
Miss Islington (bot)46426972021-05-13 23:07:20 -0700365 return f
Yury Selivanov3faaa882018-09-14 13:32:07 -0700366
367 async def main():
Yury Selivanov47150392018-09-18 17:55:44 -0400368 # Schedule three calls *concurrently*:
Miss Islington (bot)46426972021-05-13 23:07:20 -0700369 L = await asyncio.gather(
Yury Selivanov3faaa882018-09-14 13:32:07 -0700370 factorial("A", 2),
371 factorial("B", 3),
372 factorial("C", 4),
Miguel Ángel García9c53fa62018-09-18 08:01:26 +0200373 )
Miss Islington (bot)46426972021-05-13 23:07:20 -0700374 print(L)
Yury Selivanov3faaa882018-09-14 13:32:07 -0700375
376 asyncio.run(main())
377
378 # Expected output:
379 #
Miss Islington (bot)46426972021-05-13 23:07:20 -0700380 # Task A: Compute factorial(2), currently i=2...
381 # Task B: Compute factorial(3), currently i=2...
382 # Task C: Compute factorial(4), currently i=2...
Yury Selivanov3faaa882018-09-14 13:32:07 -0700383 # Task A: factorial(2) = 2
Miss Islington (bot)46426972021-05-13 23:07:20 -0700384 # Task B: Compute factorial(3), currently i=3...
385 # Task C: Compute factorial(4), currently i=3...
Yury Selivanov3faaa882018-09-14 13:32:07 -0700386 # Task B: factorial(3) = 6
Miss Islington (bot)46426972021-05-13 23:07:20 -0700387 # Task C: Compute factorial(4), currently i=4...
Yury Selivanov3faaa882018-09-14 13:32:07 -0700388 # Task C: factorial(4) = 24
Miss Islington (bot)46426972021-05-13 23:07:20 -0700389 # [2, 6, 24]
Yury Selivanov3faaa882018-09-14 13:32:07 -0700390
Vinay Sharmad42528a2020-07-20 14:12:57 +0530391 .. note::
392 If *return_exceptions* is False, cancelling gather() after it
393 has been marked done won't cancel any submitted awaitables.
394 For instance, gather can be marked done after propagating an
395 exception to the caller, therefore, calling ``gather.cancel()``
396 after catching an exception (raised by one of the awaitables) from
397 gather won't cancel any other awaitables.
398
Yury Selivanov47150392018-09-18 17:55:44 -0400399 .. versionchanged:: 3.7
400 If the *gather* itself is cancelled, the cancellation is
401 propagated regardless of *return_exceptions*.
402
Serhiy Storchaka172c0f22021-04-25 13:40:44 +0300403 .. deprecated:: 3.10
404 Deprecation warning is emitted if no positional arguments are provided
405 or not all positional arguments are Future-like objects
406 and there is no running event loop.
407
Yury Selivanov3faaa882018-09-14 13:32:07 -0700408
Yury Selivanovdb1a80e2018-09-21 16:23:15 -0400409Shielding From Cancellation
410===========================
Yury Selivanov3faaa882018-09-14 13:32:07 -0700411
Yurii Karabas86150d32020-11-29 14:50:57 +0200412.. awaitablefunction:: shield(aw)
Yury Selivanov3faaa882018-09-14 13:32:07 -0700413
Yury Selivanov47150392018-09-18 17:55:44 -0400414 Protect an :ref:`awaitable object <asyncio-awaitables>`
415 from being :meth:`cancelled <Task.cancel>`.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700416
Yury Selivanovdb1a80e2018-09-21 16:23:15 -0400417 If *aw* is a coroutine it is automatically scheduled as a Task.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100418
419 The statement::
420
Andrew Svetlov88743422017-12-11 17:35:49 +0200421 res = await shield(something())
Victor Stinnerea3183f2013-12-03 01:08:00 +0100422
Elvis Pranskevichus1fa2ec42018-09-17 19:16:44 -0400423 is equivalent to::
Victor Stinnerea3183f2013-12-03 01:08:00 +0100424
Andrew Svetlov88743422017-12-11 17:35:49 +0200425 res = await something()
Victor Stinnerea3183f2013-12-03 01:08:00 +0100426
Yury Selivanov3faaa882018-09-14 13:32:07 -0700427 *except* that if the coroutine containing it is cancelled, the
428 Task running in ``something()`` is not cancelled. From the point
429 of view of ``something()``, the cancellation did not happen.
430 Although its caller is still cancelled, so the "await" expression
Elvis Pranskevichus1fa2ec42018-09-17 19:16:44 -0400431 still raises a :exc:`CancelledError`.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100432
Yury Selivanov3faaa882018-09-14 13:32:07 -0700433 If ``something()`` is cancelled by other means (i.e. from within
434 itself) that would also cancel ``shield()``.
435
436 If it is desired to completely ignore cancellation (not recommended)
437 the ``shield()`` function should be combined with a try/except
438 clause, as follows::
Victor Stinnerea3183f2013-12-03 01:08:00 +0100439
440 try:
Andrew Svetlov88743422017-12-11 17:35:49 +0200441 res = await shield(something())
Victor Stinnerea3183f2013-12-03 01:08:00 +0100442 except CancelledError:
443 res = None
444
Serhiy Storchaka172c0f22021-04-25 13:40:44 +0300445 .. deprecated:: 3.10
446 Deprecation warning is emitted if *aw* is not Future-like object
447 and there is no running event loop.
448
Yury Selivanov950204d2016-05-16 16:23:00 -0400449
Yury Selivanov3faaa882018-09-14 13:32:07 -0700450Timeouts
451========
452
Yurii Karabas86150d32020-11-29 14:50:57 +0200453.. coroutinefunction:: wait_for(aw, timeout)
Yury Selivanov3faaa882018-09-14 13:32:07 -0700454
Yury Selivanove247b462018-09-20 12:43:59 -0400455 Wait for the *aw* :ref:`awaitable <asyncio-awaitables>`
Yury Selivanov47150392018-09-18 17:55:44 -0400456 to complete with a timeout.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700457
Yury Selivanove247b462018-09-20 12:43:59 -0400458 If *aw* is a coroutine it is automatically scheduled as a Task.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700459
460 *timeout* can either be ``None`` or a float or int number of seconds
461 to wait for. If *timeout* is ``None``, block until the future
462 completes.
463
464 If a timeout occurs, it cancels the task and raises
465 :exc:`asyncio.TimeoutError`.
466
Yury Selivanov47150392018-09-18 17:55:44 -0400467 To avoid the task :meth:`cancellation <Task.cancel>`,
468 wrap it in :func:`shield`.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700469
470 The function will wait until the future is actually cancelled,
romasku382a5632020-05-15 23:12:05 +0300471 so the total wait time may exceed the *timeout*. If an exception
472 happens during cancellation, it is propagated.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700473
Yury Selivanove247b462018-09-20 12:43:59 -0400474 If the wait is cancelled, the future *aw* is also cancelled.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700475
Yury Selivanov7372c3b2018-09-14 15:11:24 -0700476 .. _asyncio_example_waitfor:
477
Yury Selivanov3faaa882018-09-14 13:32:07 -0700478 Example::
479
480 async def eternity():
481 # Sleep for one hour
482 await asyncio.sleep(3600)
483 print('yay!')
484
485 async def main():
486 # Wait for at most 1 second
487 try:
488 await asyncio.wait_for(eternity(), timeout=1.0)
489 except asyncio.TimeoutError:
490 print('timeout!')
491
492 asyncio.run(main())
493
494 # Expected output:
495 #
496 # timeout!
497
498 .. versionchanged:: 3.7
Yury Selivanove247b462018-09-20 12:43:59 -0400499 When *aw* is cancelled due to a timeout, ``wait_for`` waits
500 for *aw* to be cancelled. Previously, it raised
Yury Selivanov3faaa882018-09-14 13:32:07 -0700501 :exc:`asyncio.TimeoutError` immediately.
502
503
504Waiting Primitives
505==================
506
Andre Delfinodcc997c2020-12-16 22:37:28 -0300507.. coroutinefunction:: wait(aws, *, timeout=None, return_when=ALL_COMPLETED)
Victor Stinnerea3183f2013-12-03 01:08:00 +0100508
Yury Selivanove247b462018-09-20 12:43:59 -0400509 Run :ref:`awaitable objects <asyncio-awaitables>` in the *aws*
Jakub Stasiak3d86d092020-11-02 11:56:35 +0100510 iterable concurrently and block until the condition specified
Yury Selivanov47150392018-09-18 17:55:44 -0400511 by *return_when*.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100512
Jakub Stasiak3d86d092020-11-02 11:56:35 +0100513 The *aws* iterable must not be empty.
Joel Rosdahl9d746582020-05-04 23:56:00 +0200514
Yury Selivanov3faaa882018-09-14 13:32:07 -0700515 Returns two sets of Tasks/Futures: ``(done, pending)``.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100516
Yury Selivanov996859a2018-09-25 14:51:21 -0400517 Usage::
518
519 done, pending = await asyncio.wait(aws)
520
Yury Selivanov3faaa882018-09-14 13:32:07 -0700521 *timeout* (a float or int), if specified, can be used to control
522 the maximum number of seconds to wait before returning.
523
524 Note that this function does not raise :exc:`asyncio.TimeoutError`.
Elvis Pranskevichus1fa2ec42018-09-17 19:16:44 -0400525 Futures or Tasks that aren't done when the timeout occurs are simply
Yury Selivanov3faaa882018-09-14 13:32:07 -0700526 returned in the second set.
527
528 *return_when* indicates when this function should return. It must
529 be one of the following constants:
Victor Stinnerea3183f2013-12-03 01:08:00 +0100530
531 .. tabularcolumns:: |l|L|
532
533 +-----------------------------+----------------------------------------+
534 | Constant | Description |
535 +=============================+========================================+
536 | :const:`FIRST_COMPLETED` | The function will return when any |
537 | | future finishes or is cancelled. |
538 +-----------------------------+----------------------------------------+
539 | :const:`FIRST_EXCEPTION` | The function will return when any |
540 | | future finishes by raising an |
541 | | exception. If no future raises an |
542 | | exception then it is equivalent to |
543 | | :const:`ALL_COMPLETED`. |
544 +-----------------------------+----------------------------------------+
545 | :const:`ALL_COMPLETED` | The function will return when all |
546 | | futures finish or are cancelled. |
547 +-----------------------------+----------------------------------------+
548
Yury Selivanov3faaa882018-09-14 13:32:07 -0700549 Unlike :func:`~asyncio.wait_for`, ``wait()`` does not cancel the
550 futures when a timeout occurs.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100551
Andrew Svetlova4888792019-09-12 15:40:40 +0300552 .. deprecated:: 3.8
553
554 If any awaitable in *aws* is a coroutine, it is automatically
555 scheduled as a Task. Passing coroutines objects to
556 ``wait()`` directly is deprecated as it leads to
557 :ref:`confusing behavior <asyncio_example_wait_coroutine>`.
558
Yury Selivanov996859a2018-09-25 14:51:21 -0400559 .. _asyncio_example_wait_coroutine:
560 .. note::
Victor Stinnerea3183f2013-12-03 01:08:00 +0100561
Yury Selivanov996859a2018-09-25 14:51:21 -0400562 ``wait()`` schedules coroutines as Tasks automatically and later
563 returns those implicitly created Task objects in ``(done, pending)``
564 sets. Therefore the following code won't work as expected::
565
566 async def foo():
567 return 42
568
569 coro = foo()
570 done, pending = await asyncio.wait({coro})
571
572 if coro in done:
573 # This branch will never be run!
574
575 Here is how the above snippet can be fixed::
576
577 async def foo():
578 return 42
579
580 task = asyncio.create_task(foo())
581 done, pending = await asyncio.wait({task})
582
583 if task in done:
584 # Everything will work as expected now.
585
jack1142de927692020-05-13 20:55:12 +0200586 .. deprecated-removed:: 3.8 3.11
Matthias Bussonnierd0ebf132019-05-20 23:20:10 -0700587
Yury Selivanov996859a2018-09-25 14:51:21 -0400588 Passing coroutine objects to ``wait()`` directly is
589 deprecated.
Victor Stinnerea3183f2013-12-03 01:08:00 +0100590
Victor Stinnerea3183f2013-12-03 01:08:00 +0100591
Andre Delfinodcc997c2020-12-16 22:37:28 -0300592.. function:: as_completed(aws, *, timeout=None)
Yury Selivanov3faaa882018-09-14 13:32:07 -0700593
Yury Selivanove247b462018-09-20 12:43:59 -0400594 Run :ref:`awaitable objects <asyncio-awaitables>` in the *aws*
Jakub Stasiak3d86d092020-11-02 11:56:35 +0100595 iterable concurrently. Return an iterator of coroutines.
Bar Harel13206b52020-05-24 02:14:31 +0300596 Each coroutine returned can be awaited to get the earliest next
Jakub Stasiak3d86d092020-11-02 11:56:35 +0100597 result from the iterable of the remaining awaitables.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700598
599 Raises :exc:`asyncio.TimeoutError` if the timeout occurs before
600 all Futures are done.
601
602 Example::
603
Bar Harel13206b52020-05-24 02:14:31 +0300604 for coro in as_completed(aws):
605 earliest_result = await coro
Yury Selivanov3faaa882018-09-14 13:32:07 -0700606 # ...
Victor Stinnerea3183f2013-12-03 01:08:00 +0100607
Serhiy Storchaka172c0f22021-04-25 13:40:44 +0300608 .. deprecated:: 3.10
609 Deprecation warning is emitted if not all awaitable objects in the *aws*
610 iterable are Future-like objects and there is no running event loop.
611
Victor Stinner3e09e322013-12-03 01:22:06 +0100612
Kyle Stanleycc2bbc22020-05-18 23:03:28 -0400613Running in Threads
614==================
615
Andre Delfinodcc997c2020-12-16 22:37:28 -0300616.. coroutinefunction:: to_thread(func, /, *args, **kwargs)
Kyle Stanleycc2bbc22020-05-18 23:03:28 -0400617
618 Asynchronously run function *func* in a separate thread.
619
620 Any \*args and \*\*kwargs supplied for this function are directly passed
Jesús Cea989af252020-11-24 00:56:30 +0100621 to *func*. Also, the current :class:`contextvars.Context` is propagated,
Kyle Stanley0f562632020-05-21 01:20:43 -0400622 allowing context variables from the event loop thread to be accessed in the
623 separate thread.
Kyle Stanleycc2bbc22020-05-18 23:03:28 -0400624
Kyle Stanley2b201362020-05-31 03:07:04 -0400625 Return a coroutine that can be awaited to get the eventual result of *func*.
Kyle Stanleycc2bbc22020-05-18 23:03:28 -0400626
627 This coroutine function is primarily intended to be used for executing
628 IO-bound functions/methods that would otherwise block the event loop if
629 they were ran in the main thread. For example::
630
631 def blocking_io():
632 print(f"start blocking_io at {time.strftime('%X')}")
633 # Note that time.sleep() can be replaced with any blocking
634 # IO-bound operation, such as file operations.
635 time.sleep(1)
636 print(f"blocking_io complete at {time.strftime('%X')}")
637
638 async def main():
639 print(f"started main at {time.strftime('%X')}")
640
641 await asyncio.gather(
642 asyncio.to_thread(blocking_io),
643 asyncio.sleep(1))
644
645 print(f"finished main at {time.strftime('%X')}")
646
647
648 asyncio.run(main())
649
650 # Expected output:
651 #
652 # started main at 19:50:53
653 # start blocking_io at 19:50:53
654 # blocking_io complete at 19:50:54
655 # finished main at 19:50:54
656
657 Directly calling `blocking_io()` in any coroutine would block the event loop
658 for its duration, resulting in an additional 1 second of run time. Instead,
659 by using `asyncio.to_thread()`, we can run it in a separate thread without
660 blocking the event loop.
661
662 .. note::
663
664 Due to the :term:`GIL`, `asyncio.to_thread()` can typically only be used
665 to make IO-bound functions non-blocking. However, for extension modules
666 that release the GIL or alternative Python implementations that don't
667 have one, `asyncio.to_thread()` can also be used for CPU-bound functions.
668
Kyle Stanley0f562632020-05-21 01:20:43 -0400669 .. versionadded:: 3.9
670
Kyle Stanleycc2bbc22020-05-18 23:03:28 -0400671
Yury Selivanov3faaa882018-09-14 13:32:07 -0700672Scheduling From Other Threads
673=============================
Victor Stinner1ad5afc2014-01-30 00:18:50 +0100674
Yury Selivanov3faaa882018-09-14 13:32:07 -0700675.. function:: run_coroutine_threadsafe(coro, loop)
Victor Stinner1ad5afc2014-01-30 00:18:50 +0100676
Yury Selivanov3faaa882018-09-14 13:32:07 -0700677 Submit a coroutine to the given event loop. Thread-safe.
Victor Stinner1ad5afc2014-01-30 00:18:50 +0100678
Yury Selivanov47150392018-09-18 17:55:44 -0400679 Return a :class:`concurrent.futures.Future` to wait for the result
680 from another OS thread.
Victor Stinner1ad5afc2014-01-30 00:18:50 +0100681
Yury Selivanov3faaa882018-09-14 13:32:07 -0700682 This function is meant to be called from a different OS thread
683 than the one where the event loop is running. Example::
Victor Stinner72dcb0a2015-04-03 17:08:19 +0200684
Yury Selivanov3faaa882018-09-14 13:32:07 -0700685 # Create a coroutine
686 coro = asyncio.sleep(1, result=3)
Yury Selivanov37f15bc2014-02-20 16:20:44 -0500687
Yury Selivanov3faaa882018-09-14 13:32:07 -0700688 # Submit the coroutine to a given loop
689 future = asyncio.run_coroutine_threadsafe(coro, loop)
Victor Stinner1ad5afc2014-01-30 00:18:50 +0100690
Yury Selivanov3faaa882018-09-14 13:32:07 -0700691 # Wait for the result with an optional timeout argument
692 assert future.result(timeout) == 3
693
694 If an exception is raised in the coroutine, the returned Future
695 will be notified. It can also be used to cancel the task in
696 the event loop::
697
698 try:
699 result = future.result(timeout)
700 except asyncio.TimeoutError:
701 print('The coroutine took too long, cancelling the task...')
702 future.cancel()
703 except Exception as exc:
Mariatta9f43fbb2018-10-24 15:37:12 -0700704 print(f'The coroutine raised an exception: {exc!r}')
Yury Selivanov3faaa882018-09-14 13:32:07 -0700705 else:
Mariatta9f43fbb2018-10-24 15:37:12 -0700706 print(f'The coroutine returned: {result!r}')
Yury Selivanov3faaa882018-09-14 13:32:07 -0700707
708 See the :ref:`concurrency and multithreading <asyncio-multithreading>`
709 section of the documentation.
710
Vaibhav Gupta3a810762018-12-26 20:17:17 +0530711 Unlike other asyncio functions this function requires the *loop*
Yury Selivanov3faaa882018-09-14 13:32:07 -0700712 argument to be passed explicitly.
713
714 .. versionadded:: 3.5.1
715
716
717Introspection
718=============
719
720
721.. function:: current_task(loop=None)
722
723 Return the currently running :class:`Task` instance, or ``None`` if
724 no task is running.
725
726 If *loop* is ``None`` :func:`get_running_loop` is used to get
727 the current loop.
728
729 .. versionadded:: 3.7
730
731
732.. function:: all_tasks(loop=None)
733
734 Return a set of not yet finished :class:`Task` objects run by
735 the loop.
736
737 If *loop* is ``None``, :func:`get_running_loop` is used for getting
738 current loop.
739
740 .. versionadded:: 3.7
741
742
743Task Object
744===========
745
Andre Delfinodcc997c2020-12-16 22:37:28 -0300746.. class:: Task(coro, *, loop=None, name=None)
Yury Selivanov3faaa882018-09-14 13:32:07 -0700747
Yury Selivanovdb1a80e2018-09-21 16:23:15 -0400748 A :class:`Future-like <Future>` object that runs a Python
Yury Selivanov3faaa882018-09-14 13:32:07 -0700749 :ref:`coroutine <coroutine>`. Not thread-safe.
750
751 Tasks are used to run coroutines in event loops.
752 If a coroutine awaits on a Future, the Task suspends
753 the execution of the coroutine and waits for the completion
754 of the Future. When the Future is *done*, the execution of
755 the wrapped coroutine resumes.
756
757 Event loops use cooperative scheduling: an event loop runs
758 one Task at a time. While a Task awaits for the completion of a
759 Future, the event loop runs other Tasks, callbacks, or performs
760 IO operations.
761
762 Use the high-level :func:`asyncio.create_task` function to create
Elvis Pranskevichus1fa2ec42018-09-17 19:16:44 -0400763 Tasks, or the low-level :meth:`loop.create_task` or
764 :func:`ensure_future` functions. Manual instantiation of Tasks
765 is discouraged.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700766
767 To cancel a running Task use the :meth:`cancel` method. Calling it
768 will cause the Task to throw a :exc:`CancelledError` exception into
769 the wrapped coroutine. If a coroutine is awaiting on a Future
770 object during cancellation, the Future object will be cancelled.
771
772 :meth:`cancelled` can be used to check if the Task was cancelled.
773 The method returns ``True`` if the wrapped coroutine did not
774 suppress the :exc:`CancelledError` exception and was actually
775 cancelled.
776
777 :class:`asyncio.Task` inherits from :class:`Future` all of its
778 APIs except :meth:`Future.set_result` and
779 :meth:`Future.set_exception`.
780
781 Tasks support the :mod:`contextvars` module. When a Task
782 is created it copies the current context and later runs its
783 coroutine in the copied context.
Elvis Pranskevichuse2b340a2018-05-29 17:31:01 -0400784
785 .. versionchanged:: 3.7
Yury Selivanov3faaa882018-09-14 13:32:07 -0700786 Added support for the :mod:`contextvars` module.
787
788 .. versionchanged:: 3.8
789 Added the ``name`` parameter.
790
Andrew Svetlova4888792019-09-12 15:40:40 +0300791 .. deprecated-removed:: 3.8 3.10
792 The *loop* parameter.
793
Serhiy Storchaka172c0f22021-04-25 13:40:44 +0300794 .. deprecated:: 3.10
795 Deprecation warning is emitted if *loop* is not specified
796 and there is no running event loop.
797
Chris Jerdonek1ce58412020-05-15 16:55:50 -0700798 .. method:: cancel(msg=None)
Yury Selivanov3faaa882018-09-14 13:32:07 -0700799
800 Request the Task to be cancelled.
801
802 This arranges for a :exc:`CancelledError` exception to be thrown
803 into the wrapped coroutine on the next cycle of the event loop.
804
805 The coroutine then has a chance to clean up or even deny the
806 request by suppressing the exception with a :keyword:`try` ...
807 ... ``except CancelledError`` ... :keyword:`finally` block.
808 Therefore, unlike :meth:`Future.cancel`, :meth:`Task.cancel` does
809 not guarantee that the Task will be cancelled, although
810 suppressing cancellation completely is not common and is actively
811 discouraged.
812
Chris Jerdonek1ce58412020-05-15 16:55:50 -0700813 .. versionchanged:: 3.9
814 Added the ``msg`` parameter.
815
Yury Selivanov7372c3b2018-09-14 15:11:24 -0700816 .. _asyncio_example_task_cancel:
817
Yury Selivanov3faaa882018-09-14 13:32:07 -0700818 The following example illustrates how coroutines can intercept
819 the cancellation request::
820
821 async def cancel_me():
822 print('cancel_me(): before sleep')
823
824 try:
825 # Wait for 1 hour
826 await asyncio.sleep(3600)
827 except asyncio.CancelledError:
828 print('cancel_me(): cancel sleep')
829 raise
830 finally:
831 print('cancel_me(): after sleep')
832
833 async def main():
834 # Create a "cancel_me" Task
835 task = asyncio.create_task(cancel_me())
836
837 # Wait for 1 second
838 await asyncio.sleep(1)
839
840 task.cancel()
841 try:
842 await task
843 except asyncio.CancelledError:
844 print("main(): cancel_me is cancelled now")
845
846 asyncio.run(main())
847
848 # Expected output:
849 #
850 # cancel_me(): before sleep
851 # cancel_me(): cancel sleep
852 # cancel_me(): after sleep
853 # main(): cancel_me is cancelled now
854
855 .. method:: cancelled()
856
857 Return ``True`` if the Task is *cancelled*.
858
859 The Task is *cancelled* when the cancellation was requested with
860 :meth:`cancel` and the wrapped coroutine propagated the
861 :exc:`CancelledError` exception thrown into it.
862
863 .. method:: done()
864
865 Return ``True`` if the Task is *done*.
866
867 A Task is *done* when the wrapped coroutine either returned
868 a value, raised an exception, or the Task was cancelled.
869
Yury Selivanove247b462018-09-20 12:43:59 -0400870 .. method:: result()
871
872 Return the result of the Task.
873
874 If the Task is *done*, the result of the wrapped coroutine
875 is returned (or if the coroutine raised an exception, that
876 exception is re-raised.)
877
878 If the Task has been *cancelled*, this method raises
879 a :exc:`CancelledError` exception.
880
881 If the Task's result isn't yet available, this method raises
882 a :exc:`InvalidStateError` exception.
883
884 .. method:: exception()
885
886 Return the exception of the Task.
887
888 If the wrapped coroutine raised an exception that exception
889 is returned. If the wrapped coroutine returned normally
890 this method returns ``None``.
891
892 If the Task has been *cancelled*, this method raises a
893 :exc:`CancelledError` exception.
894
895 If the Task isn't *done* yet, this method raises an
896 :exc:`InvalidStateError` exception.
897
898 .. method:: add_done_callback(callback, *, context=None)
899
900 Add a callback to be run when the Task is *done*.
901
902 This method should only be used in low-level callback-based code.
903
904 See the documentation of :meth:`Future.add_done_callback`
905 for more details.
906
907 .. method:: remove_done_callback(callback)
908
909 Remove *callback* from the callbacks list.
910
911 This method should only be used in low-level callback-based code.
912
913 See the documentation of :meth:`Future.remove_done_callback`
914 for more details.
915
Andre Delfinodcc997c2020-12-16 22:37:28 -0300916 .. method:: get_stack(*, limit=None)
Yury Selivanov3faaa882018-09-14 13:32:07 -0700917
918 Return the list of stack frames for this Task.
919
920 If the wrapped coroutine is not done, this returns the stack
921 where it is suspended. If the coroutine has completed
922 successfully or was cancelled, this returns an empty list.
923 If the coroutine was terminated by an exception, this returns
924 the list of traceback frames.
925
926 The frames are always ordered from oldest to newest.
927
928 Only one stack frame is returned for a suspended coroutine.
929
930 The optional *limit* argument sets the maximum number of frames
931 to return; by default all available frames are returned.
932 The ordering of the returned list differs depending on whether
933 a stack or a traceback is returned: the newest frames of a
934 stack are returned, but the oldest frames of a traceback are
935 returned. (This matches the behavior of the traceback module.)
936
Andre Delfinodcc997c2020-12-16 22:37:28 -0300937 .. method:: print_stack(*, limit=None, file=None)
Yury Selivanov3faaa882018-09-14 13:32:07 -0700938
939 Print the stack or traceback for this Task.
940
941 This produces output similar to that of the traceback module
942 for the frames retrieved by :meth:`get_stack`.
943
944 The *limit* argument is passed to :meth:`get_stack` directly.
945
946 The *file* argument is an I/O stream to which the output
947 is written; by default output is written to :data:`sys.stderr`.
948
Alex Grönholm98ef9202019-05-30 18:30:09 +0300949 .. method:: get_coro()
950
951 Return the coroutine object wrapped by the :class:`Task`.
952
953 .. versionadded:: 3.8
954
Yury Selivanov3faaa882018-09-14 13:32:07 -0700955 .. method:: get_name()
956
957 Return the name of the Task.
958
959 If no name has been explicitly assigned to the Task, the default
960 asyncio Task implementation generates a default name during
961 instantiation.
962
963 .. versionadded:: 3.8
964
965 .. method:: set_name(value)
966
967 Set the name of the Task.
968
969 The *value* argument can be any object, which is then
970 converted to a string.
971
972 In the default Task implementation, the name will be visible
973 in the :func:`repr` output of a task object.
974
975 .. versionadded:: 3.8
976
Yury Selivanov3faaa882018-09-14 13:32:07 -0700977
978.. _asyncio_generator_based_coro:
979
980Generator-based Coroutines
981==========================
982
983.. note::
984
985 Support for generator-based coroutines is **deprecated** and
Yury Selivanovfad6af22018-09-25 17:44:52 -0400986 is scheduled for removal in Python 3.10.
Yury Selivanov3faaa882018-09-14 13:32:07 -0700987
988Generator-based coroutines predate async/await syntax. They are
Elvis Pranskevichus1fa2ec42018-09-17 19:16:44 -0400989Python generators that use ``yield from`` expressions to await
Yury Selivanov3faaa882018-09-14 13:32:07 -0700990on Futures and other coroutines.
991
992Generator-based coroutines should be decorated with
993:func:`@asyncio.coroutine <asyncio.coroutine>`, although this is not
994enforced.
995
996
997.. decorator:: coroutine
998
999 Decorator to mark generator-based coroutines.
1000
1001 This decorator enables legacy generator-based coroutines to be
1002 compatible with async/await code::
1003
1004 @asyncio.coroutine
1005 def old_style_coroutine():
1006 yield from asyncio.sleep(1)
1007
1008 async def main():
1009 await old_style_coroutine()
1010
Yury Selivanov3faaa882018-09-14 13:32:07 -07001011 This decorator should not be used for :keyword:`async def`
1012 coroutines.
1013
Andrew Svetlov68b34a72019-05-16 17:52:10 +03001014 .. deprecated-removed:: 3.8 3.10
1015
1016 Use :keyword:`async def` instead.
1017
Yury Selivanov3faaa882018-09-14 13:32:07 -07001018.. function:: iscoroutine(obj)
1019
1020 Return ``True`` if *obj* is a :ref:`coroutine object <coroutine>`.
1021
1022 This method is different from :func:`inspect.iscoroutine` because
Yury Selivanov59ee5b12018-09-27 15:48:30 -04001023 it returns ``True`` for generator-based coroutines.
Yury Selivanov3faaa882018-09-14 13:32:07 -07001024
1025.. function:: iscoroutinefunction(func)
1026
1027 Return ``True`` if *func* is a :ref:`coroutine function
1028 <coroutine>`.
1029
1030 This method is different from :func:`inspect.iscoroutinefunction`
1031 because it returns ``True`` for generator-based coroutine functions
1032 decorated with :func:`@coroutine <coroutine>`.