import asyncio
async def delayed_task(delay, message):
await asyncio.sleep(delay)
print(message)
async def main():
await asyncio.gather(
delayed_task(2, "Задача 1 выполнена"),
delayed_task(1, "Задача 2 выполнена")
)
asyncio.run(main())
`asyncio.gather()` позволяет запускать несколько задач конкурентно.
Для организации отложенного выполнения задачи с использованием asyncio.sleep()
в Python, необходимо использовать возможности библиотеки asyncio
, которая позволяет писать конкурентный код с использованием синтаксиса async/await
.
Пример реализации:
import asyncio
async def отложенная_задача(время_задержки, задача):
"""
Откладывает выполнение задачи на указанное время.
Args:
время_задержки: Время в секундах, на которое нужно отложить выполнение.
задача: Функция, которую нужно выполнить после задержки.
"""
print(f"Начинаем ожидание задачи на {время_задержки} секунд...")
await asyncio.sleep(время_задержки)
print(f"Время ожидания истекло. Выполняем задачу: {задача.__name__}")
await задача() # Предполагается, что задача тоже является корутиной
async def пример_задачи():
"""
Пример асинхронной задачи.
"""
print("Выполняется пример асинхронной задачи!")
await asyncio.sleep(1) # добавлено для демонстрации асинхронности
print("Задача завершена!")
async def main():
"""
Главная функция, запускающая отложенную задачу.
"""
await отложенная_задача(5, пример_задачи) # Откладываем выполнение на 5 секунд
if __name__ == "__main__":
asyncio.run(main())
Пояснения к коду:
async def отложенная_задача(время_задержки, задача):
: Определяет асинхронную функцию, которая принимает время задержки (в секундах) и саму задачу (корутину).await asyncio.sleep(время_задержки):
: Приостанавливает выполнение корутины на указанное количество секунд. Во время ожидания, event loop может переключиться на выполнение других задач. Это главное отличие от time.sleep()
, который блокирует поток.await задача():
: После истечения времени задержки, вызывается переданная асинхронная задача. Важно использовать await
, так как задача
тоже является корутиной.async def пример_задачи():
: Определяет пример простой асинхронной задачи. В реальных проектах эта задача может быть сложной и включать ввод-вывод, сетевые запросы и т.д.async def main():
: Определяет главную асинхронную функцию, которая запускает отложенная_задача
.asyncio.run(main()):
: Запускает event loop и выполняет асинхронную функцию main()
. asyncio.run()
автоматически создает и управляет event loop.Важные моменты:
asyncio.sleep()
является неблокирующей. Это означает, что во время ожидания, event loop может выполнять другие задачи, предотвращая "зависание" программы.asyncio.run()
или создать и запустить event loop вручную (что требуется в более сложных случаях).await
.Альтернативные подходы (в зависимости от контекста):
Timer
из threading
модуля для простых задач, не требующих асинхронности и работающих в отдельном потоке. Однако, это может привести к блокировке, если задача занимает много времени.