Я работал следующий пример из учебного руководства Doug Hellmann на многопроцессорной обработке:
import multiprocessing
def worker():
"""worker function"""
print 'Worker'
return
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
Когда я пытался выполнить его вне если оператор:
import multiprocessing
def worker():
"""worker function"""
print 'Worker'
return
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
Это начало порождать процессы без остановок и единственный способ остановиться, это была перезагрузка!
Почему это произошло бы? Почему это не генерировало 5 процессов и выход? Почему мне нужно если оператор?
В Windows нет подпрограммы fork ()
, поэтому multiprocessing
импортирует текущий модуль, чтобы получить доступ к функции worker
. Без оператора if
дочерний процесс запускает своих собственных потомков и так далее.
Обратите внимание, что в документации упоминается, что вам нужен оператор if
для окон ( здесь ).
Однако в документации не сказано, что это почти мгновенно убивает вашу машину, требуя перезагрузки. Так что это может сбивать с толку, особенно если использование многопроцессорности
происходит в какой-то функции глубоко внутри кода. Независимо от того, насколько глубоко он скрыт, вам все равно понадобится отметка if
в основном файле программы. Это в значительной степени исключает использование многопроцессорной обработки
в любой библиотеке.
многопроцессорность
в целом кажется немного грубой. У него может быть интерфейс интерфейса потока, но нет простого способа обойти GIL.
Для более сложных проблем распараллеливания я бы также посмотрел на модуль subprocess
или некоторые другие библиотеки (например, mpi4py или Parallel Python ).
Я не знаю о многопроцессорности
, но подозреваю, что она порождает дочерние процессы с другим __ name __
global. Удаляя тест, вы заставляете каждого ребенка снова запускать процесс нереста.