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 модуля для простых задач, не требующих асинхронности и работающих в отдельном потоке. Однако, это может привести к блокировке, если задача занимает много времени.