В чем разница синхронности и асинхронности в Python
Что проверяют
Понимаете ли вы, что асинхронность в Python это кооперативная многозадачность в одном потоке, и когда она вообще даёт выигрыш.
Как отвечать
Синхронный код выполняется подряд: пока идёт запрос к базе или сети, поток стоит и ждёт. Асинхронный на время ожидания отдаёт управление, и цикл событий берёт другую задачу.
async def fetch_all(urls):
async with aiohttp.ClientSession() as session:
return await asyncio.gather(*(fetch(session, u) for u in urls))Сто запросов выполняются за время самого долгого, а не за сумму.
Ключевое, что нужно сказать: асинхронность помогает только на ожидании (сеть, диск, база). Для вычислений выигрыша нет: код по-прежнему исполняется в одном потоке, и тяжёлая функция просто заблокирует цикл событий целиком.
Отсюда выбор инструмента:
asyncio: много одновременных операций ввода-вывода;- потоки: тоже ввод-вывод, но с библиотеками, не умеющими асинхронность;
- процессы: вычисления, потому что у каждого свой интерпретатор и свой GIL.
Асинхронность заразна: вызвать await можно только из async-функции, поэтому переход обычно тянет за собой весь путь исполнения и требует асинхронных библиотек (asyncpg вместо psycopg2, httpx вместо requests).
Где спотыкаются
Ставят обычный блокирующий вызов внутрь async-функции и удивляются, что скорость не выросла: цикл событий встал вместе с ним. Такие вызовы уносят в run_in_executor.
Считают, что асинхронность это многопоточность. Поток один, параллелизма по процессору нет.
Забывают, что корутина без await не выполняется вовсе: вызов coro() создаёт объект, а не запускает работу.