Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Асинхронность в Python
Асинхронность — это парадигма программирования, которая позволяет выполнять долгие операции без блокирования основного потока выполнения. Это критично для Data Scientists при работе с большими объёмами данных и API.
Основные концепции
Синхронный код выполняется последовательно: каждая операция ждёт завершения предыдущей. Это приводит к неэффективности при работе с I/O (сетевые запросы, чтение файлов).
Асинхронный код позволяет переключаться между задачами, пока одна ждёт результата. Пока первый запрос обрабатывается, можно обработать второй и третий.
async/await синтаксис
import asyncio
import aiohttp
async def fetch_data(session, url):
async with session.get(url) as response:
return await response.json()
async def main():
async with aiohttp.ClientSession() as session:
urls = ['http://api1.com', 'http://api2.com', 'http://api3.com']
tasks = [fetch_data(session, url) for url in urls]
results = await asyncio.gather(*tasks)
return results
asyncio.run(main())
Ключевые элементы
async def — определяет асинхронную функцию (корутину). Такая функция возвращает объект-корутину, который нужно await'ить.
await — ждёт завершения асинхронной операции и возвращает результат. Может использоваться только внутри async функции.
asyncio.gather() — запускает несколько корутин параллельно и ждёт их завершения.
asyncio.run() — точка входа для запуска асинхронного кода из синхронного контекста.
Практическое применение в DS
async def load_training_data():
sources = ['database_api', 'storage_api', 'cache_api']
async def get_from_source(source):
async with aiohttp.ClientSession() as session:
async with session.get(f'https://api.com/{source}') as resp:
return await resp.json()
results = await asyncio.gather(
*[get_from_source(s) for s in sources]
)
return results
Event Loop
Внутри Python работает event loop — ядро асинхронной системы. Это цикл, который постоянно проверяет готовые корутины, выполняет их, и переходит к следующей, если текущая ждёт результата.
Отличие от многопоточности
Threading — истинный параллелизм (несколько потоков одновременно), но сложнее с синхронизацией.
async/await — кооперативная многозадачность в одном потоке, более безопасно.
На практике я использую асинхронность для параллельных API запросов, что критично в data pipeline'ах с множественными источниками данных.