Как работает asyncio
Рассмотрим задачу создания двух веб-запросов.
Синхронная версия:
- Отправка запроса 1
- Ожидание ответа в течение 1 се c.
- Отправка запроса 2
- Ожидание ответа в течение 1 се c.
- Оба запроса завершены в 2 se c.
Асинхронная версия:
- Отправить запрос 1
- Вместо ожидания немедленно отправьте запрос 2
- Ожидать ответы более 1 сек c.
- Оба запроса завершены в 1 сек c.
asyncio
позволяет писать программу, которая на самом деле работает как во второй асинхронной версии, в то время как ваш код очень похож на (интуитивно понятную) первую версию.
Обратите внимание на важную вещь: единственная причина, по которой асинхронная версия быстрее заключается в том, что он сразу же начинает другую параллельную операцию, а не ждет, когда первая полностью завершена. Он не имеет ничего общего с потоками, asyncio
работает в одном основном потоке.
А как насчет дискового ввода-вывода?
Может ли ваше оборудование параллельно считывать / записывать два файла?
Если у вас есть один физический жесткий диск, то, вероятно, нет: у него есть одна физическая «игла» , которая может одновременно считывать / записывать один фрагмент данных. Асинхронный подход вам тогда не поможет.
Ситуация может отличаться, если у вас несколько дисков . Хотя у меня есть идея, может ли OS / asyncio
работать параллельно с несколькими дисками (, вероятно, не ).
Предположим, вы ожидаете, что ваше оборудование и ОС будут поддерживать несколько дисковых операций ввода-вывода. О. Вероятно, он будет работать только при использовании нескольких потоков или процессов для операций:
- Модуль aiofiles использует потоки для работы с файлами - вы можете попробовать
- Для работы с процессами с
ProcessPoolExecutor
& asyncio
вы можете использовать run_in_executor
, как показано здесь
Также есть некоторый шанс, что использование процессов или даже потоков увеличит диск Ввод-вывод исключительно из-за распараллеливания связанных операций с процессором, но я понятия не имею, так ли это и насколько он полезен (вероятно, не сильно по сравнению с дисковым вводом-выводом).