Многопоточность на Python: threading vs multiprocessing vs asyncio
Крактие выводы на основе личного опыта. Без воды
- На простых задачах вроде чтения/записи в файл и математических вычислениях используй модуль
Threading
с его потоками (классThread
).
При этом учти, что настоящую многопоточность сделать с помощью этого модуля не получится из-за ограничений самого Python (читай о GIL в Python'е)
- Когда работа идёт асинхронно и у кода в каком-либо месте есть возможность передохнуть (продолжительная запись в файл, отправка запроса + получение ответа в случае с не сильно быстрым интернетом или же передачей файлов), используй asyncio с его async-await.
Почему? Потому что у кода есть время на перерыв, и это время можно использовать
- Когда тебе нужно, чтобы два процесса (две программы) работали одновременно и при этом ещё и обменивались данными между собой (что-то на компе + одновременно что-то в интернете), используй настоящую многопоточность, она же
multiprocessing
Именно модуль multiprocessing
позволяет добиться настоящего параллелизма
(true parallelism) в Питоне, обойдя ограничений GIL, и разместить задачи по разным CPU / логичным ядрам.
Частые вопросы ❓
Что такое GIL?
Почему в Python интегрировали механизм GIL?
Как работает multiprocessing?