многопоточность для задач, связанных с вводом-выводом, и многопроцессорность для задач, связанных с процессором - PullRequest
0 голосов
/ 03 марта 2020

https://realpython.com/async-io-python/ дает представление о многопоточности и многопроцессорности, но не дает четкого представления о том, что действительно в целом или действует только в среде Python. Например, он говорит:

параллелизм включает в себя как многопроцессорность (идеально подходит для задач, связанных с ЦП), так и многопоточность (подходит для задач, связанных с вводом-выводом)

Я разработал параллельный приложения с другими языками программирования, такими как C / C ++, и это утверждение кажется мне странным. Почему многопоточность не подходит для задач, связанных с процессором, и многопроцессорность для задач, связанных с вводом-выводом в целом ? AFAIK оба могут быть эффективно использованы для обеих задач. Выбор между обоими зависит от других критериев, таких как гранулярность задачи, степень общего состояния и зависимость порядка выполнения между задачами и стоимость создания процесса / потока (выше для процессов, особенно в некоторых ОС). Указанное выше утверждение относится c к среде Python и ограничениям интерпретатора глобальной блокировки?

1 Ответ

0 голосов
/ 05 марта 2020

Как сказал Роб Пайк, со-изобретатель языка Go:

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

Из книги Лучано Рамальо, "Свободно Python" Глава 18 , стр. 557.

То, что они пытаются сказать, это то, что многопроцессорная обработка (это также название библиотеки, используемой в Python для параллелизма) - это способ решения проблем, когда вам действительно нужно несколько задач, связанных с процессором. или параллельные задачи. В Python это достигается путем обхода GIL с использованием, например, Python Многопроцессорного модуля

В Python есть нечто, называемое GIL, позволяющее запускать только один нить в то время. Вам нужно будет обойти GIL, чтобы использовать параллелизм. Между тем, вы можете достичь параллелизма даже с ограничением GIL: одновременно может выполняться только один поток !!

В Python вы можете достичь параллелизма с:

  • Threads,
  • Фьючерсы (на основе потоков)
  • и Asyn c Ввод / вывод (не на основе потоков, а циклы событий и совместная многозадачность)

Итак, как вы можете видеть у вас есть 3 способа параллелизма, но из-за ограничения GIL вы не можете использовать его в параллельных задачах или задачах с привязкой к процессору

Я нашел статью, которая может помочь вам с параллелизмом и Asyn c I / O

Параллелизм в Python с Asyn c I / O

Для достижения параллелизма в Python вам необходимо обойти GIL. Модуль python, который помогает с этим, называется «многопроцессорность».

По поводу ваших сомнений:

... (который говорит, что многопроцессорность идеальна для задач, связанных с ЦП, а многопоточность идеальна для задач, связанных с вводом-выводом) относится только к среде Python.

Я не могу сказать, относится ли она только к Python, поскольку я не знаю всех других языков, но, например, Javascript печально известен своим асинхронным c подходом ввода / вывода, в то время как C#, C ++, Java достигают параллелизма и параллелизма без каких-либо неудобств или ограничений при использовании потоков. C# as JavaScript также реализовал Asyn c I / O долгое время go.

Оба, Дэвид Бизли и Лукаш Ланга упомянули этот факт в следующих беседах

  • Дэвид Бизли, выступление на PyCon Brazil 2015

  • Дэвид Бизли, любопытный курс по сопрограммам и параллелизму

  • Лукаш Ланга, Мышление в сопрограммах - PyCon 2016

Ссылки также представлены в представлении ниже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...