asyncio
в Python предоставляет инфраструктуру для написания конкурентного кода с использованием синтаксиса async
/await
. Она позволяет выполнять несколько задач "параллельно" в рамках одного потока, что эффективно для I/O-зависимых операций (например, сетевых запросов), повышая производительность приложений. Ключевые компоненты: event loop (цикл событий), сопрограммы (coroutines), tasks (задачи) и futures (обещания).
Библиотека asyncio
в Python - это библиотека, предназначенная для написания конкурентного (concurrent) кода с использованием синтаксиса async/await
. Она предоставляет инфраструктуру для создания однопоточных конкурентных приложений, основанных на event loop (цикле событий).
Ключевые особенности и компоненты asyncio
:
asyncio
. Отслеживает выполнение задач и вызывает необходимые callback-и, когда задача готова к продолжению. Он отвечает за переключение между корутинами. Только один event loop может работать в потоке в данный момент времени.async def
. Они могут быть приостановлены и возобновлены, что позволяет выполнять несколько задач в одном потоке без использования потоков операционной системы. Корутины выполняются конкурентно, а не параллельно (в стандартном Python, из-за GIL).async/await
: Ключевые слова, используемые для написания асинхронного кода. await
приостанавливает выполнение корутины до тех пор, пока не будет получен результат другого асинхронного действия (например, I/O операции). async
используется для объявления корутин.Lock
, Event
, Condition
, Semaphore
и другие, которые позволяют координировать выполнение корутин и избегать гонок данных.Преимущества использования asyncio
:
async/await
делает асинхронный код более читаемым и простым в поддержке, по сравнению с использованием callback-ов или потоков.Сценарии использования asyncio
:
Пример:
import asyncio
async def fetch_data(url):
# Имитация асинхронной операции (например, запрос к API)
await asyncio.sleep(1) # Не блокирует цикл событий
return f"Данные с {url}"
async def main():
urls = ["https://example.com/1", "https://example.com/2", "https://example.com/3"]
tasks = [fetch_data(url) for url in urls]
results = await asyncio.gather(*tasks) # Запускает задачи конкурентно
for result in results:
print(result)
if __name__ == "__main__":
asyncio.run(main())