asyncio-task.md
1> **Источник:** https://python-all.ru/3.6/library/asyncio-task.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.5.3. Задачи и корутины89**Исходный код:** [Lib/asyncio/tasks.py](https://python-all.ru/src/3.6/Lib/asyncio/tasks.py)1011**Исходный код:** [Lib/asyncio/coroutines.py](https://python-all.ru/src/3.6/Lib/asyncio/coroutines.py)1213## 18.5.3.1. Корутины1415Корутины, используемые с [`asyncio`](https://python-all.ru/3.6/library/asyncio.html#module-asyncio), могут быть реализованы с помощью выражения [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def) или с использованием [генераторов](https://python-all.ru/3.6/glossary.html#term-generator). Тип корутин [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def) был добавлен в Python 3.5 и рекомендуется, если нет необходимости поддерживать более старые версии Python.1617Корутины на основе генераторов следует декорировать с помощью [`@asyncio.coroutine`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.coroutine), хотя это строго не требуется. Декоратор обеспечивает совместимость с корутинами [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def), а также служит документацией. Корутины на основе генераторов используют синтаксис `yield from`, введённый в [**PEP 380**](https://python-all.ru/3.6/library/asyncio-task.html), вместо исходного синтаксиса `yield`.1819Слово «корутина», как и слово «генератор», используется для двух различных (хотя и связанных) понятий:2021- Функция, которая определяет корутину (определение функции с помощью [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def) или декорированная с помощью `@asyncio.coroutine`). Если требуется различение, мы будем называть её *корутинной функцией* ([`iscoroutinefunction()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.iscoroutinefunction) возвращает `True`).22- Объект, полученный вызовом корутинной функции. Этот объект представляет собой вычисление или операцию ввода-вывода (обычно их комбинацию), которая в конечном итоге завершится. Если требуется различение, мы будем называть его *объектом корутины* ([`iscoroutine()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.iscoroutine) возвращает `True`).2324Что может делать корутина:2526- `result = await future` или `result = yield from future` – приостанавливает корутину до завершения future, затем возвращает результат future или возбуждает исключение, которое будет распространено. (Если future отменено, будет возбуждено исключение `CancelledError`.) Обратите внимание, что задачи являются future, и всё сказанное о future применимо также к задачам.27- `result = await coroutine` или `result = yield from coroutine` – ожидание другой корутины для получения результата (или возбуждения исключения, которое будет распространено). Выражение `coroutine` должно быть *вызовом* другой корутины.28- `return expression` – выдать результат корутине, ожидающей данную через [`await`](https://python-all.ru/3.6/reference/expressions.html#await) или `yield from`.29- `raise exception` – возбудить исключение в корутине, которая ожидает данную через [`await`](https://python-all.ru/3.6/reference/expressions.html#await) или `yield from`.3031Вызов корутины не запускает выполнение её кода – объект корутины, возвращённый вызовом, ничего не делает, пока его выполнение не будет запланировано. Есть два основных способа запустить его: вызвать `await coroutine` или `yield from coroutine` из другой корутины (при условии, что другая корутина уже выполняется!) или запланировать его выполнение с помощью функции [`ensure_future()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.ensure_future) или метода [`AbstractEventLoop.create_task()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.create_task).3233Корутины (и задачи) могут выполняться только когда запущен цикл событий.3435#### `@asyncio.coroutine`3637Декоратор для пометки корутин на основе генераторов. Он позволяет генератору использовать `yield from` для вызова корутин [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def), а также позволяет вызывать генератор из корутин [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def), например, с помощью выражения [`await`](https://python-all.ru/3.6/reference/expressions.html#await).3839Нет необходимости декорировать сами корутины [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def).4041Если из генератора не было выполнено yield from до его уничтожения, в журнал записывается сообщение об ошибке. См. [Обнаружение корутин, которые никогда не были запланированы](https://python-all.ru/3.6/library/asyncio-dev.html#asyncio-coroutine-not-scheduled).4243> **Примечание**44>45> В этой документации некоторые методы описаны как корутины, даже если они являются обычными функциями Python, возвращающими [`Future`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future). Это сделано намеренно, чтобы сохранить возможность изменять реализацию этих функций в будущем. Если такую функцию необходимо использовать в коде в стиле колбэков, оберните её результат с помощью [`ensure_future()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.ensure_future).4647### 18.5.3.1.1. Пример: корутина Hello World4849Пример корутины, выводящей `"Hello World"`:5051```python52import asyncio5354async def hello_world():55 print("Hello World!")5657loop = asyncio.get_event_loop()58# Блокирующий вызов, который возвращает управление после завершения корутины hello_world()59loop.run_until_complete(hello_world())60loop.close()61```6263> **См. также**64>65> Пример [Hello World с call\_soon()](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio-hello-world-callback) использует метод [`AbstractEventLoop.call_soon()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.call_soon) для планирования колбэка.6667### 18.5.3.1.2. Пример: корутина, отображающая текущую дату6869Пример корутины, отображающей текущую дату каждую секунду в течение 5 секунд, с помощью функции [`sleep()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.sleep):7071```python72import asyncio73import datetime7475async def display_date(loop):76 end_time = loop.time() + 5.077 while True:78 print(datetime.datetime.now())79 if (loop.time() + 1.0) >= end_time:80 break81 await asyncio.sleep(1)8283loop = asyncio.get_event_loop()84# Блокирующий вызов, который возвращает управление после завершения корутины display_date()85loop.run_until_complete(display_date(loop))86loop.close()87```8889> **См. также**90>91> Пример [отображение текущей даты с помощью call\_later()](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio-date-callback) использует колбэк с методом [`AbstractEventLoop.call_later()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.call_later).9293### 18.5.3.1.3. Пример: цепочка корутин9495Пример соединения корутин в цепочку:9697```python98import asyncio99100async def compute(x, y):101 print("Compute %s + %s ..." % (x, y))102 await asyncio.sleep(1.0)103 return x + y104105async def print_sum(x, y):106 result = await compute(x, y)107 print("%s + %s = %s" % (x, y, result))108109loop = asyncio.get_event_loop()110loop.run_until_complete(print_sum(1, 2))111loop.close()112```113114`compute()` зацеплена за `print_sum()`: корутина `print_sum()` ожидает завершения `compute()`, прежде чем вернуть свой результат.115116Диаграмма последовательности примера:117118119120«Задача» создаётся методом [`AbstractEventLoop.run_until_complete()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.run_until_complete), когда он получает объект корутины вместо задачи.121122Диаграмма показывает поток управления, она не описывает точно, как всё работает внутри. Например, корутина sleep создаёт внутренний future, который использует [`AbstractEventLoop.call_later()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.call_later), чтобы разбудить задачу через 1 секунду.123124## 18.5.3.2. InvalidStateError125126#### `exception asyncio.InvalidStateError`127128Операция не разрешена в этом состоянии.129130## 18.5.3.3. TimeoutError131132#### `exception asyncio.TimeoutError`133134Операция превысила заданный срок.135136> **Примечание**137>138> Это исключение отличается от встроенного исключения [`TimeoutError`](https://python-all.ru/3.6/library/exceptions.html#TimeoutError)!139140## 18.5.3.4. Future141142#### `class asyncio.Future(*, loop=None)`143144Этот класс *почти* совместим с [`concurrent.futures.Future`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.Future).145146Отличия:147148- [`result()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future.result) и [`exception()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future.exception) не принимают аргумент таймаута и вызывают исключение, если future ещё не завершён.149- Колбэки, зарегистрированные с помощью [`add_done_callback()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future.add_done_callback), всегда вызываются через [`call_soon()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.call_soon) цикла событий.150- Этот класс несовместим с функциями [`wait()`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.wait) и [`as_completed()`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.as_completed) из пакета [`concurrent.futures`](https://python-all.ru/3.6/library/concurrent.futures.html#module-concurrent.futures).151152This class is [не является потокобезопасным](https://python-all.ru/3.6/library/asyncio-dev.html#asyncio-multithreading).153154#### `cancel()`155156Отменить future и запланировать вызов колбэков.157158Если future уже завершён или отменён, вернуть `False`. В противном случае изменить состояние future на «отменён», запланировать вызов колбэков и вернуть `True`.159160#### `cancelled()`161162Вернуть `True`, если future был отменён.163164#### `done()`165166Вернуть `True`, если future завершён.167168«Завершён» означает либо наличие результата или исключения, либо то, что future был отменён.169170#### `result()`171172Вернуть результат, который представляет этот future.173174Если future был отменён, возбуждается `CancelledError`. Если результат future ещё недоступен, возбуждается [`InvalidStateError`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.InvalidStateError). Если future завершён и для него установлено исключение, возбуждается это исключение.175176#### `exception()`177178Вернуть исключение, которое было установлено для этого future.179180Исключение (или `None`, если исключение не было установлено) возвращается только если future завершён. Если future был отменён, возбуждается `CancelledError`. Если future ещё не завершён, возбуждается [`InvalidStateError`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.InvalidStateError).181182#### `add_done_callback(fn)`183184Добавить колбэк, который будет вызван, когда future станет завершённым.185186Колбэк вызывается с одним аргументом – объектом future. Если future уже завершён на момент вызова, колбэк планируется с помощью [`call_soon()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.call_soon).187188[Используйте functools.partial для передачи параметров колбэку](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio-pass-keywords). Например, `fut.add_done_callback(functools.partial(print, "Future:", flush=True))` вызовет `print("Future:", fut, flush=True)`.189190#### `remove_done_callback(fn)`191192Удалить все экземпляры колбэка из списка «вызвать при завершении».193194Возвращает количество удалённых колбэков.195196#### `set_result(result)`197198Пометить future как завершённый и установить его результат.199200Если метод вызывается, когда future уже завершён, возбуждается [`InvalidStateError`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.InvalidStateError).201202#### `set_exception(exception)`203204Пометить future как завершённый и установить исключение.205206Если метод вызывается, когда future уже завершён, возбуждается [`InvalidStateError`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.InvalidStateError).207208### 18.5.3.4.1. Пример: Future с run\_until\_complete()209210Пример сочетания [`Future`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future) и [корутинной функции](https://python-all.ru/3.6/library/asyncio-task.html#coroutine):211212```python213import asyncio214215async def slow_operation(future):216 await asyncio.sleep(1)217 future.set_result('Future is done!')218219loop = asyncio.get_event_loop()220future = asyncio.Future()221asyncio.ensure_future(slow_operation(future))222loop.run_until_complete(future)223print(future.result())224loop.close()225```226227Корутинная функция отвечает за вычисление (занимает 1 секунду) и сохраняет результат в future. Метод [`run_until_complete()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.run_until_complete) ожидает завершения future.228229> **Примечание**230>231> Метод [`run_until_complete()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.run_until_complete) внутри использует метод [`add_done_callback()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future.add_done_callback), чтобы получать уведомление о том, что future завершена.232233### 18.5.3.4.2. Пример: Future с run\_forever()234235Предыдущий пример можно записать иначе, используя метод [`Future.add_done_callback()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future.add_done_callback), чтобы явно описать поток управления:236237```python238import asyncio239240async def slow_operation(future):241 await asyncio.sleep(1)242 future.set_result('Future is done!')243244def got_result(future):245 print(future.result())246 loop.stop()247248loop = asyncio.get_event_loop()249future = asyncio.Future()250asyncio.ensure_future(slow_operation(future))251future.add_done_callback(got_result)252try:253 loop.run_forever()254finally:255 loop.close()256```257258В этом примере future используется для связывания `slow_operation()` с `got_result()`: когда `slow_operation()` завершается, вызывается `got_result()` с результатом.259260## 18.5.3.5. Задача261262#### `class asyncio.Task(coro, *, loop=None)`263264Планирует выполнение [корутины](https://python-all.ru/3.6/library/asyncio-task.html#coroutine): оборачивает её в future. Задача является подклассом [`Future`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future).265266Задача отвечает за выполнение корутины в цикле событий. Если обёрнутая корутина использует yield from для future, задача приостанавливает выполнение обёрнутой корутины и ожидает завершения future. Когда future завершается, выполнение обёрнутой корутины возобновляется с результатом или исключением future.267268Циклы событий используют кооперативное планирование: цикл событий запускает только одну задачу за раз. Другие задачи могут выполняться параллельно, если другие циклы событий работают в разных потоках. Пока задача ожидает завершения future, цикл событий выполняет новую задачу.269270Отмена задачи отличается от отмены future. Вызов [`cancel()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Task.cancel) вызовет [`CancelledError`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.CancelledError) в обёрнутую корутину. [`cancelled()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future.cancelled) возвращает `True`, только если обёрнутая корутина не перехватила исключение [`CancelledError`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.CancelledError) или вызвала исключение [`CancelledError`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.CancelledError).271272Если ожидающая задача уничтожается, выполнение её обёрнутой [корутины](https://python-all.ru/3.6/library/asyncio-task.html#coroutine) не завершилось. Вероятно, это ошибка, и в журнал записывается предупреждение: см. [Ожидающая задача уничтожена](https://python-all.ru/3.6/library/asyncio-dev.html#asyncio-pending-task-destroyed).273274Не создавайте экземпляры [`Task`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Task) напрямую: используйте функцию [`ensure_future()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.ensure_future) или метод [`AbstractEventLoop.create_task()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.create_task).275276This class is [не является потокобезопасным](https://python-all.ru/3.6/library/asyncio-dev.html#asyncio-multithreading).277278#### `classmethod all_tasks(loop=None)`279280Возвращает набор всех задач для цикла событий.281282По умолчанию возвращаются все задачи для текущего цикла событий.283284#### `classmethod current_task(loop=None)`285286Возвращает текущую выполняющуюся задачу в цикле событий или `None`.287288По умолчанию возвращается текущая задача для текущего цикла событий.289290`None` возвращается при вызове не в контексте [`Task`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Task).291292#### `cancel()`293294Запрашивает отмену этой задачи.295296Это организует вызов [`CancelledError`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.CancelledError) в обёрнутую корутину на следующем цикле событий. Корутина затем может очистить ресурсы или даже отклонить запрос с помощью try/except/finally.297298В отличие от [`Future.cancel()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future.cancel), это не гарантирует, что задача будет отменена: исключение может быть перехвачено и обработано, что отложит отмену задачи или предотвратит её полностью. Задача также может вернуть значение или вызвать другое исключение.299300Сразу после вызова этого метода [`cancelled()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future.cancelled) не вернёт `True` (если задача уже не была отменена). Задача будет отмечена как отменённая, когда обёрнутая корутина завершится с исключением [`CancelledError`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.CancelledError) (даже если [`cancel()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Task.cancel) не вызывался).301302#### `get_stack(*, limit=None)`303304Возвращает список фреймов стека для корутины этой задачи.305306Если корутина не завершена, возвращается стек, в котором она приостановлена. Если корутина успешно завершилась или была отменена, возвращается пустой список. Если корутина была прервана исключением, возвращается список фреймов traceback.307308Кадры всегда упорядочены от старых к новым.309310Необязательный параметр limit задаёт максимальное количество возвращаемых фреймов; по умолчанию возвращаются все доступные фреймы. Его значение различается в зависимости от того, возвращается стек или traceback: возвращаются самые новые фреймы стека, но самые старые фреймы traceback. (Это соответствует поведению модуля traceback.)311312По независящим от нас причинам для приостановленной корутины возвращается только один фрейм стека.313314#### `print_stack(*, limit=None, file=None)`315316Выводит стек или traceback для корутины этой задачи.317318Вывод похож на вывод модуля traceback для фреймов, полученных с помощью get\_stack(). Аргумент limit передаётся в get\_stack(). Аргумент file – это I/O поток, в который записывается вывод; по умолчанию вывод записывается в sys.stderr.319320### 18.5.3.5.1. Пример: Параллельное выполнение задач321322Пример параллельного выполнения 3 задач (A, B, C):323324```python325import asyncio326327async def factorial(name, number):328 f = 1329 for i in range(2, number+1):330 print("Task %s: Compute factorial(%s)..." % (name, i))331 await asyncio.sleep(1)332 f *= i333 print("Task %s: factorial(%s) = %s" % (name, number, f))334335loop = asyncio.get_event_loop()336loop.run_until_complete(asyncio.gather(337 factorial("A", 2),338 factorial("B", 3),339 factorial("C", 4),340))341loop.close()342```343344Вывод:345346```python347Task A: Compute factorial(2)...348Task B: Compute factorial(2)...349Task C: Compute factorial(2)...350Task A: factorial(2) = 2351Task B: Compute factorial(3)...352Task C: Compute factorial(3)...353Task B: factorial(3) = 6354Task C: Compute factorial(4)...355Task C: factorial(4) = 24356```357358Задача автоматически планируется на выполнение при её создании. Цикл событий останавливается, когда все задачи завершены.359360## 18.5.3.6. Функции задач361362> **Примечание**363>364> В приведённых ниже функциях опциональный аргумент *loop* позволяет явно задать объект цикла событий, используемый нижележащей задачей или корутиной. Если он не указан, используется цикл событий по умолчанию.365366#### `asyncio.as_completed(fs, *, loop=None, timeout=None)`367368Возвращает итератор, значения которого при ожидании являются экземплярами [`Future`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future).369370Вызывает [`asyncio.TimeoutError`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.TimeoutError), если время ожидания истекло до завершения всех Future.371372Пример:373374```python375for f in as_completed(fs):376 result = yield from f # Выражение 'yield from' может возбуждать исключение377 # Используйте результат378```379380> **Примечание**381>382> Будущие объекты `f` не обязательно являются элементами fs.383384#### `asyncio.ensure_future(coro_or_future, *, loop=None)`385386Планирует выполнение [корутинного объекта](https://python-all.ru/3.6/library/asyncio-task.html#coroutine): оборачивает его в future. Возвращает объект [`Task`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Task).387388Если аргумент является [`Future`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future), он возвращается напрямую.389390Новое в версии 3.4.4.391392Изменено в версии 3.5.1: Функция принимает любой [ожидаемый](https://python-all.ru/3.6/glossary.html#term-awaitable) объект.393394> **См. также**395>396> Метод [`AbstractEventLoop.create_task()`](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.create_task).397398#### `asyncio.async(coro_or_future, *, loop=None)`399400Устаревший псевдоним [`ensure_future()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.ensure_future).401402Устарело с версии 3.4.4.403404#### `asyncio.wrap_future(future, *, loop=None)`405406Оборачивает объект [`concurrent.futures.Future`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.Future) в объект [`Future`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future).407408#### `asyncio.gather(*coros_or_futures, loop=None, return_exceptions=False)`409410Возвращает future, агрегирующий результаты от заданных корутинных объектов или future.411412Все future должны использовать один и тот же цикл событий. Если все задачи выполнены успешно, результатом возвращённого future будет список результатов (в порядке исходной последовательности, не обязательно в порядке поступления результатов). Если *return\_exceptions* равен true, исключения в задачах обрабатываются так же, как успешные результаты, и собираются в результирующий список; в противном случае первое возникшее исключение немедленно распространяется на возвращённый future.413414Отмена: если внешний Future отменён, все дочерние (ещё не завершённые) также отменяются. Если какой-либо дочерний элемент отменён, это рассматривается так, как если бы он вызвал [`CancelledError`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.CancelledError) – в этом случае внешний Future *не* отменяется. (Это предотвращает отмену одного дочернего элемента, которая может привести к отмене других.)415416Изменено в версии 3.6.6: Если сам *gather* отменён, отмена распространяется независимо от *return\_exceptions*.417418#### `asyncio.iscoroutine(obj)`419420Возвращает `True`, если *obj* является [корутинным объектом](https://python-all.ru/3.6/library/asyncio-task.html#coroutine), который может быть основан на генераторе или корутине [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def).421422#### `asyncio.iscoroutinefunction(func)`423424Возвращает `True`, если *func* определена как [корутинная функция](https://python-all.ru/3.6/library/asyncio-task.html#coroutine), которая может быть декорированной функцией-генератором или функцией [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def).425426#### `asyncio.run_coroutine_threadsafe(coro, loop)`427428Отправляет [корутинный объект](https://python-all.ru/3.6/library/asyncio-task.html#coroutine) в заданный цикл событий.429430Возвращает [`concurrent.futures.Future`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.Future) для доступа к результату.431432Эта функция предназначена для вызова из другого потока, отличного от того, в котором работает цикл событий. Использование:433434```python435# Создать корутину436coro = asyncio.sleep(1, result=3)437# Отправить корутину в заданный цикл438future = asyncio.run_coroutine_threadsafe(coro, loop)439# Ожидать результат с необязательным аргументом таймаута440assert future.result(timeout) == 3441```442443Если в корутине возникнет исключение, возвращённый future будет уведомлён. Его также можно использовать для отмены задачи в цикле событий:444445```python446try:447 result = future.result(timeout)448except asyncio.TimeoutError:449 print('The coroutine took too long, cancelling the task...')450 future.cancel()451except Exception as exc:452 print('The coroutine raised an exception: {!r}'.format(exc))453else:454 print('The coroutine returned: {!r}'.format(result))455```456457См. раздел [concurrency and multithreading](https://python-all.ru/3.6/library/asyncio-dev.html#asyncio-multithreading) документации.458459> **Примечание**460>461> В отличие от других функций модуля, [`run_coroutine_threadsafe()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.run_coroutine_threadsafe) требует явной передачи аргумента *loop*.462463Новое в версии 3.5.1.464465#### `coroutine asyncio.sleep(delay, result=None, *, loop=None)`466467Создаёт [корутину](https://python-all.ru/3.6/library/asyncio-task.html#coroutine), которая завершается через указанное время (в секундах). Если указан *result*, то при завершении корутины он передаётся вызывающему коду.468469Точность задержки зависит от [гранулярности цикла событий](https://python-all.ru/3.6/library/asyncio-eventloop.html#asyncio-delayed-calls).470471Эта функция является [корутиной](https://python-all.ru/3.6/library/asyncio-task.html#coroutine).472473#### `coroutine asyncio.shield(arg, *, loop=None)`474475Ожидает future, защищая его от отмены.476477Выражение:478479```python480res = yield from shield(something())481```482483полностью эквивалентна следующему выражению:484485```python486res = yield from something()487```488489*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. But its caller is still cancelled, so the yield-from expression still raises [`CancelledError`](https://python-all.ru/3.6/library/concurrent.futures.html#concurrent.futures.CancelledError). Note: If `something()` is cancelled by other means this will still cancel `shield()`.490491Если требуется полностью игнорировать отмену (не рекомендуется), можно объединить `shield()` с конструкцией try/except следующим образом:492493```python494try:495 res = yield from shield(something())496except CancelledError:497 res = None498```499500#### `coroutine asyncio.wait(futures, *, loop=None, timeout=None, return_when=ALL_COMPLETED)`501502Ожидает завершения объектов Future и корутин, заданных последовательностью *futures*. Корутины будут обёрнуты в задачи. Возвращает два набора [`Future`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future): (done, pending).503504Последовательность *futures* не должна быть пустой.505506*timeout* можно использовать для управления максимальным количеством секунд ожидания перед возвратом. *timeout* может быть целым числом или числом с плавающей запятой. Если *timeout* не указан или `None`, время ожидания не ограничено.507508*return\_when* указывает, когда функция должна вернуть результат. Значением должна быть одна из следующих констант модуля [`concurrent.futures`](https://python-all.ru/3.6/library/concurrent.futures.html#module-concurrent.futures):509510| Константа | Описание |511| --- | --- |512| `FIRST_COMPLETED` | Функция вернёт результат, когда любой future завершится или будет отменён. |513| `FIRST_EXCEPTION` | Функция вернёт результат, когда любой future завершится, возбудив исключение. Если ни один future не возбудит исключение, это эквивалентно `ALL_COMPLETED`. |514| `ALL_COMPLETED` | Функция вернёт результат, когда все future завершатся или будут отменены. |515516Эта функция является [корутиной](https://python-all.ru/3.6/library/asyncio-task.html#coroutine).517518Использование:519520```python521done, pending = yield from asyncio.wait(fs)522```523524> **Примечание**525>526> Это не возбуждает [`asyncio.TimeoutError`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.TimeoutError)! Future, которые не завершены при наступлении тайм-аута, возвращаются во втором наборе.527528#### `coroutine asyncio.wait_for(fut, timeout, *, loop=None)`529530Ожидает завершения единственного [`Future`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Future) или [объекта-корутины](https://python-all.ru/3.6/library/asyncio-task.html#coroutine) с тайм-аутом. Если *timeout* равно `None`, блокируется до завершения future.531532Корутина будет обёрнута в [`Task`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.Task).533534Возвращает результат Future или корутины. При наступлении тайм-аута она отменяет задачу и возбуждает [`asyncio.TimeoutError`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.TimeoutError). Чтобы избежать отмены задачи, оберните её в [`shield()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.shield).535536Если ожидание отменяется, future *fut* также отменяется.537538Эта функция является [корутиной](https://python-all.ru/3.6/library/asyncio-task.html#coroutine), пример использования:539540```python541result = yield from asyncio.wait_for(fut, 60.0)542```543544Изменено в версии 3.4.3: Если ожидание отменяется, future *fut* теперь также отменяется.545