решая среди подпроцесса, многопроцессорной обработки и потока в Python?

Я хотел бы параллелизировать свою программу Python так, чтобы она могла использовать несколько процессоров на машине, на которой она работает. Мое распараллеливание очень просто, в тот, все параллельные "потоки" программы независимы и пишут свой вывод для разделения файлов. Мне не нужны потоки для обмена информацией, но обязательно, чтобы я знал, когда потоки заканчиваются, так как некоторые шаги моего конвейера зависят от своего вывода.

Мобильность важна, в котором я хотел бы, чтобы это работало на любой версии Python на Mac, Linux и Windows. Учитывая эти ограничения, который является самым соответствующим модулем Python для реализации этого? Я пытаюсь решить между потоком, подпроцессом и многопроцессорной обработкой, которую все, кажется, обеспечивают связанной функциональности.

Какие-либо мысли об этом? Я хотел бы простое решение, это портативно.

103
задан Vaibhav Mule 9 October 2017 в 15:23
поделиться

3 ответа

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

Модуль подпроцесса также позволяет запускать несколько процессов, но я обнаружил, что он менее удобен в использовании, чем новый модуль многопроцессорности.

Потоки, как известно, тонкие, и с CPython вы часто ограничены одним ядром, с ними (хотя, как отмечалось в одном из комментариев, глобальная блокировка интерпретатора (GIL) может быть выпущена в коде C, вызываемом из Код Python).

Я считаю, что большинство функций трех модулей, которые вы цитируете, можно использовать независимо от платформы. Что касается переносимости, обратите внимание, что многопроцессорность входит в стандартную комплектацию только начиная с Python 2.6 (хотя существует версия для некоторых более старых версий Python). Но это отличный модуль!

63
ответ дан 24 November 2019 в 04:16
поделиться

В аналогичном случае я выбрал отдельные процессы и небольшую часть необходимой связи через сетевой сокет. Он очень портативен и довольно прост в использовании с использованием python, но, вероятно, не проще (в моем случае у меня было еще одно ограничение: связь с другими процессами, написанными на C ++).

В вашем случае я, вероятно, выбрал бы многопроцессорность, поскольку потоки Python, по крайней мере, при использовании CPython, не являются настоящими потоками. Что ж, это собственные системные потоки, но модули C, вызываемые из Python, могут или не могут выпускать GIL и разрешать другим потокам их запускать при вызове кода блокировки.

5
ответ дан 24 November 2019 в 04:16
поделиться

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

4
ответ дан 24 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: