<aside>
📖 todo:
Темы по асинхронному коду:
Что такое async и await?
aiohttp
asyncio
корутины
event loop
threading
multiprocessing
GIL для чего используется? Как мы с ними взаимодействует? Как влияет на приложение? Как обнаружить?
</aside>
Что такое async и await?
…
Какие библиотеки есть в python для конкурентного и параллельного выполнения кода?
Threading, multiprocessing, asyncio
- Threading — в рамках 1-го процесса делим потоки. У потоков есть общая память и они там как-то конкурентно выполняются. Нужно ставить блокировки, чтобы они с безопасно работали с памятью.
- Multiprocessing — позволяет запускать программу в разных процессах, которые не зависят друг от друга. С python 3.8 у них появился shared memory. В остальном они независимы друг от друга. Для работы с multiprocessing нужна многоядерная архитектура процессора.
- Asyncio — библиотека, которая принесла нам event loop. Цикл идет по таскам (корутинам), опрашивает их на выполнение и в зависимости от ответов как-то работает.
Когда что использовать?
У нас есть различные типы ожиданий: IO bound (ожидание ввода-вывода), CPU bound (программа зависит от скорости процессора).
Если ждем задач от CPU, то нам подойдет только multiprocessing.
Если ждём IO, то можем использовать threading или asyncio. Если быстрые задачи IO или python староват, то берем threading. Если python 3.6+ и IO медленный, то берем asyncio.
В Python существует многозадачность (multithreading) и многозадачность на уровне процессов (multiprocessing), но из-за GIL (Global Interpreter Lock) многозадачность на уровне потоков (threads) не всегда способна полностью использовать многозадачные возможности многопроцессорных систем.
Ключевые аспекты многозадачности в Python:
- Многозадачность на уровне процессов (Multiprocessing): Python поддерживает создание и управление отдельными процессами с помощью модуля multiprocessing. Каждый процесс имеет свой собственный интерпретатор Python и, следовательно, собственный GIL. Это позволяет полностью использовать многозадачные возможности многопроцессорных систем и выполнять параллельные задачи независимо.
- Многозадачность на уровне потоков (Multithreading): Python также поддерживает многозадачность на уровне потоков с использованием модуля threading. Однако из-за GIL, все потоки в одном процессе разделяют один и тот же интерпретатор Python, что ограничивает их способность эффективно использовать многозадачные возможности многопроцессорных систем. Это особенно заметно в CPU-интенсивных задачах.
- Многозадачность на уровне асинхронности (Asynchronous Multithreading): Для асинхронного программирования, связанного с I/O-интенсивными задачами, Python предоставляет модули
asyncio
и async
/await
, которые позволяют эффективно управлять множеством асинхронных задач с использованием одного потока.
Таким образом, в Python многозадачность возможна, но способность использования многозадачных ресурсов многопроцессорных систем зависит от конкретных сценариев и задач, а также от выбранного подхода (multiprocessing, multithreading или асинхронность).
Концепция event loop’а:
Рассказать, что это цикл по корутинам. Корутины возвращают future (промисы), у которых есть свои статусы.
Важно не заблочить корутиной весь event loop.
+/- asyncio: