Сопрограмма — это специальный вид функции, которая может приостанавливать своё выполнение и возобновлять его в определённой точке, сохраняя при этом своё состояние. Это более общая концепция, чем генераторы, используемая для кооперативной многозадачности.
Сопрограммы создаются с помощью ключевого слова async def
:
async def my_coroutine():
print("Start coroutine")
await asyncio.sleep(1)
print("End coroutine")
Объявляет функцию как сопрограмму (начиная с Python 3.5)
Приостанавливает выполнение сопрограммы до завершения awaitable-объекта:
async def fetch_data():
print("Fetching data...")
await asyncio.sleep(2) # Приостановка на 2 секунды
return "Data received"
Для выполнения сопрограмм необходим цикл событий:
import asyncio
async def main():
await fetch_data()
asyncio.run(main()) # Запуск цикла событий
Характеристика | Сопрограммы | Генераторы |
---|---|---|
Синтаксис | async def, await | yield, yield from |
Возвращаемое значение | Awaitable-объект | Итератор |
Основное назначение | Асинхронные операции | Ленивые вычисления |
Версия Python | 3.5+ | 2.2+ |
async def greet(name):
print(f"Hello, {name}")
await asyncio.sleep(1)
print(f"Goodbye, {name}")
asyncio.run(greet("Alice"))
async def task1():
await asyncio.sleep(1)
return "Task 1 done"
async def task2():
await asyncio.sleep(2)
return "Task 2 done"
async def main():
results = await asyncio.gather(task1(), task2())
print(results) # ['Task 1 done', 'Task 2 done']
asyncio.run(main())
async def risky_operation():
try:
await asyncio.sleep(1)
raise ValueError("Something went wrong")
except ValueError as e:
print(f"Caught error: {e}")
return None
asyncio.run(risky_operation())
await
Сопрограмма — это:
async def
await
) и возобновлятьсяСопрограммы особенно полезны для I/O-bound приложений, где важно эффективно использовать время ожидания операций ввода-вывода.