Разница: multiprocessing, multithreading, asyncio в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Руководство по использованию ресурсов в Python:

  • Многопроцессорность: Применимо к вычислительно сложным задачам, позволяет всем менять ограничения GIL, используя несколько CPU.
Python
Скопировать код
from multiprocessing import Process

def compute_heavy(): pass  # Тяжёлые вычисления, вроде поиска иглы в стоге сена
Process(target=compute_heavy).start()
  • Многопоточность: Она оптимальна для задач, связанных с ожиданием I/O и возможностью параллельного выполнения, обусловленной освобождением GIL во время операций I/O.
Python
Скопировать код
from threading import Thread

def disk_io_bound(): pass  # Ожидание I/O, похожее на ожидание дождя в пустыне
Thread(target=disk_io_bound).start()
  • Asyncio: Лучший инструмент для асинхронных I/O-операций с эффективным переключением между задачами и снижением возможных проблем, связанных с многопоточностью.
Python
Скопировать код
import asyncio

async def async_io_operation(): pass  # I/O настолько замедленное, что вам хватит времени даже прочесть "Войну и мир" целиком!
asyncio.run(async_io_operation())

Вкратце: используйте многопроцессорность для CPU-затратных задач, многопоточность для задач, требующих ожидания I/O в синхронном режиме и asyncio для асинхронного I/O.

Кинга Идем в IT: пошаговый план для смены профессии

Выбор подходящей модели параллелизма

Подбор оптимального варианта параллелизма существенно влияет на эффективность и удобство поддержки вашего приложения.

Потоки: Быстрый ввод-вывод, ограниченное число соединений

  • Многопоточность отлично подходит для задач, требующих интенсивной работы с I/O, при ограниченном числе соединений и минимальном использовании CPU.

Asyncio и uvloop: Медленный ввод-вывод, большое число соединений

  • Для медленных I/O задач и большого числа соединений, таких как долгие опросы или веб-сокеты, asyncio с неблокирующим подходом ускоряет обработку.
  • Uvloop значительно повышает скорость работы asyncio, так, HTTP-сервер Japronto использует uvloop для более быстрой обработки запросов.

Многопроцессорность: Вычислительно сложные задачи

  • Для задач, требующих интенсивных вычислений, многопроцессорность распределяет нагрузку между ядрами CPU, тем самым ускоряя выполнение.
  • Важно учесть, что межпроцессное взаимодействие зачастую требует дополнительных ресурсов, и его использование не всегда бывает эффективным – применяйте осознанно.

Упрощение параллелизма с помощью concurrent.futures

Для простых сценариев параллелизма используйте concurrent.futures.Executor, который предоставляет API для многопоточности и многопроцессорности.

Тонкий контроль с помощью asyncio

Получите детальный контроль над асинхронностью благодаря async и await в asyncio. В Python 3.9 используйте asyncio.to_thread для упрощения вызова синхронных функций.

Визуализация

Вот как мы можем изобразить концепции параллелизма, представив их в виде аттракционов в парке развлечений:

Markdown
Скопировать код
| Аттракцион          | Стиль               | Описание                                                     |
| ------------------- | ------------------- | ------------------------------------------------------------ |
| 🎢 Многопоточность   | Горки               | Множество вагончиков (потоков) на одной рельсе (процессе) с одним двигателем (GIL). Оптимально подходит для задач I/O. |
| 🚄 Многопроцессорность | Поезда              | Независимые поезда (процессы), каждый на своей колее (ядрах CPU), без общих ресурсов, идеально подходят для ресурсозатратных задач на CPU. |
| 🛶 Asyncio            | Плавание на реке    | Одна лодка (цикл событий) эффективно маневрирует между пунктами (сопрограммами), идеально подходит для асинхронной многозадачности. |
  • 🎢 Потоки эффективно организуют I/O операции, используя свободное время CPU.
  • 🚄 Независимые процессы эффективно используют все доступные ядра CPU.
  • 🛶 Asyncio сочетает в себе спокойствие с контролем, идеально подходит для многозадачности на I/O.

Повышение производительности и масштабируемость

Выбор модели параллелизма – только начало. Ниже приведены несколько советов по оптимизации и масштабированию вашего кода:

Asyncio и uvloop: Повышение производительности

  • Для повышения производительности использовать asyncio совместно с uvloop.
  • Будьте осторожны с блокирующими вызовами и старайтесь использовать асинхронные библиотеки.

Многопоточность и многопроцессорность: Что стоит избегать...

  • всегда обращайте внимание на потокобезопасность данных и примитивов, чтобы избежать проблем при многопоточной работе.
  • Помните, что неэффективное использование многопроцессорности может привести к частому переключению контекстов CPU и излишним затратам.

Как избежать распространенных ошибок

  • Не все задачи могут быть эффективно распараллелены. Некоторые алгоритмы по своей природе последовательны.
  • Есть мнение, что любую проблему производительности можно решить с помощью многопоточности или многопроцессорности. Однако параллелизм – не панацея.

Полезные материалы

  1. concurrent.futures — Запуск параллельных задач — Python 3.12.2 — официальная документация Python по concurrent.futures.
  2. Async IO в Python: Полное руководство – Real Python — детальное объяснение и примеры использования asyncio.
  3. Многопоточность для начинающих: параллельность и конкурентность в Python | Toptal® — гайд по многопроцессорной работе и многопоточности в Python.
  4. asyncio — Асинхронный ввод-вывод — Python 3.12.2 — официальная документация по asyncio.
  5. multiprocessing — Параллельность на базе процессов — Python 3.12.2 — руководство по многопроцессорной работе в Python.
  6. Многопоточность – Многопроцессорность против многопоточности Python – Stack Overflow — споры о различиях между многопоточной работой и многопроцессорностью.
  7. Параллелизм — pysheeet — введение в многопоточное программирование с concurrent.futures.