Многопроцессорная бомба

Я работал следующий пример из учебного руководства 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 процессов и выход? Почему мне нужно если оператор?

36
задан Ηλίας 29 September 2010 в 16:39
поделиться

3 ответа

В Windows нет подпрограммы fork () , поэтому multiprocessing импортирует текущий модуль, чтобы получить доступ к функции worker . Без оператора if дочерний процесс запускает своих собственных потомков и так далее.

46
ответ дан 27 November 2019 в 05:58
поделиться

Обратите внимание, что в документации упоминается, что вам нужен оператор if для окон ( здесь ).

Однако в документации не сказано, что это почти мгновенно убивает вашу машину, требуя перезагрузки. Так что это может сбивать с толку, особенно если использование многопроцессорности происходит в какой-то функции глубоко внутри кода. Независимо от того, насколько глубоко он скрыт, вам все равно понадобится отметка if в основном файле программы. Это в значительной степени исключает использование многопроцессорной обработки в любой библиотеке.

многопроцессорность в целом кажется немного грубой. У него может быть интерфейс интерфейса потока, но нет простого способа обойти GIL.

Для более сложных проблем распараллеливания я бы также посмотрел на модуль subprocess или некоторые другие библиотеки (например, mpi4py или Parallel Python ).

8
ответ дан 27 November 2019 в 05:58
поделиться

Я не знаю о многопроцессорности , но подозреваю, что она порождает дочерние процессы с другим __ name __ global. Удаляя тест, вы заставляете каждого ребенка снова запускать процесс нереста.

4
ответ дан 27 November 2019 в 05:58
поделиться
Другие вопросы по тегам:

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