4.1 Метод run()
Модуль asyncio предоставляет множество методов и функций для создания и управления асинхронными программами. Вот некоторые из наиболее популярных и часто используемых методов и функций модуля asyncio.
Сегодня мы рассмотрим 4 самых частых:
run()sleep()wait()gather()
А теперь с подробностями:
Метод asyncio.run(coroutine)
Этот метод используется для запуска асинхронной программы. Он особенно полезен, когда вы хотите запустить асинхронный код из синхронного контекста, например, из основного потока программы.
Метод asyncio.run() запускает основную корутину и управляет созданием и закрытием цикла событий. Этот метод автоматически создаёт новый цикл событий и завершает его по завершении выполнения корутины.
Сигнатура:
asyncio.run(async_function(), *, debug=False)
Где:
-
async_function: Корутина, которую необходимо выполнить. -
debug: Необязательный параметр, включающий режим отладки для цикла событий.
Пример использования:
import asyncio
async def main():
print('Hello')
await asyncio.sleep(1)
print('World')
asyncio.run(main())
Ограничения
Не может быть вызван изнутри другого цикла событий:
asyncio.run() должен вызываться только из синхронного кода, так как он создаёт и завершает свой собственный цикл событий. Если попытаться вызвать его изнутри уже существующего цикла событий, это вызовет ошибку.
Подходит только для верхнего уровня:
Этот метод предназначен для запуска основного входа в программу и не должен использоваться для вложенных вызовов асинхронных функций.
4.2 Метод sleep()
Этот метод используется, когда вам нужно приостановить выполнение корутины на определенное время, не блокируя при этом выполнение других корутин.
Метод asyncio.sleep() в модуле asyncio используется для приостановки выполнения текущей корутины на заданное количество секунд.
Этот метод отличается от аналогичного метода time.sleep() тем, что позволяет другим задачам выполняться во время приостановки. Это делает его полезным для написания асинхронных программ, которые требуют задержек или ожидания без блокировки основного потока.
Сигнатура:
asyncio.sleep(delay, result=None)
Где:
-
delay: Время задержки в секундах (может быть дробным числом). -
result: Опциональный результат, который будет возвращён после завершения задержки.
Пример применения:
import asyncio
async def main():
print('Start sleeping')
await asyncio.sleep(2)
print('Wake up')
asyncio.run(main())
В этом примере корутина main приостанавливается на 2 секунды, позволяя другим задачам выполняться в это время, затем продолжается и печатает "Wake up".
4.3 Метод wait()
Этот метод полезен, когда вам нужно дождаться завершения нескольких асинхронных операций, но вы хотите иметь более тонкий контроль над процессом ожидания.
Метод asyncio.wait() в модуле asyncio позволяет ожидать завершения нескольких асинхронных задач или корутин. Можно ждать завершения всех задач, первой завершённой задачи или завершения любой задачи с ошибкой.
В отличие от gather(), метод wait() даёт больше контроля над процессом ожидания, позволяя задать timeout и условия завершения.
Основные особенности метода asyncio.wait()
Сигнатура:
asyncio.wait(fs, *, timeout=None, return_when=ALL_COMPLETED)
Где:
-
fs: Коллекция объектовFutureили корутин, которые необходимо ожидать. -
timeout: Необязательный параметр, указывающий максимальное время ожидания в секундах. Если время ожидания истекло, метод возвращает те задачи, которые были завершены к этому моменту. -
return_when: Условие, определяющее, когда метод должен завершиться. Возможные значения:-
ALL_COMPLETED: Метод возвращает результат, когда все задачи завершены (по умолчанию). -
FIRST_COMPLETED: Метод возвращает результат, когда завершена первая задача. -
FIRST_EXCEPTION: Метод возвращает результат, когда любая задача завершена с исключением.
-
Ожидает завершения нескольких задач или корутин. Можно указать время ожидания и условия завершения.
import asyncio
async def say(what, delay):
await asyncio.sleep(delay)
return what
async def main():
task1 = asyncio.create_task(say('hello', 1))
task2 = asyncio.create_task(say('world', 2))
done, pending = await asyncio.wait([task1, task2], timeout=1.5)
for task in done:
print(task.result())
asyncio.run(main())
В примере выше мы оборачиваем каждую корутину say() в объект Task с помощью вызова метода create_task(), а затем передаём список этих тасков в метод wait(). Объекты Task позволяют выполнять корутины параллельно, не ожидая завершения одной перед запуском другой.
Метод wait() будет ждать выполнения задач только полторы секунды, после чего вернёт кортеж тасков: первое значение кортежа будет содержать задачи, которые успели выполниться (done), второе — которые ещё в процессе (pending).
4.4 Метод gather()
Этот метод особенно полезен, когда вам нужно запустить несколько асинхронных операций параллельно и получить их результаты в виде списка.
Метод asyncio.gather() в модуле asyncio используется для выполнения нескольких асинхронных задач параллельно и возврата их результатов в виде списка. Это удобный способ группировать корутины или задачи и ожидать их завершения.
Основные особенности метода asyncio.gather()
Сигнатура:
asyncio.gather(*coros_or_futures, return_exceptions=False)
Где:
-
coros_or_futures: Корутины или объектыFuture, которые должны быть выполнены. -
return_exceptions: Булево значение, указывающее, должны ли исключения возвращаться как результаты. По умолчаниюFalse.
Пример использования
import asyncio
async def say_after(delay, what):
await asyncio.sleep(delay)
return what
async def main():
results = await asyncio.gather(
say_after(1, 'hello'),
say_after(2, 'world')
)
print(results)
asyncio.run(main())
Этот пример показывает, как asyncio.gather может быть использован для параллельного выполнения нескольких задач, каждая из которых имеет свою задержку. Результаты всех задач возвращаются в виде списка. В отличие от wait, gather не просто ожидает завершения задач, но и собирает результаты всех корутин, что делает его удобным для случаев, когда важен результат выполнения каждой задачи.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ