Многопроцессорная обработка Python непрерывно порождает процессы pythonw.exe, не выполняя никакой реальной работы

) Я не понимаю, почему этот простой код

# file: mp.py
from multiprocessing import Process
import sys

def func(x):
    print 'works ', x + 2
    sys.stdout.flush()

p = Process(target= func, args= (2, ))
p.start()
p.join()
p.terminate()
print 'done'
sys.stdout.flush()

создает процессы "pythonw.exe" непрерывно и ничего не выводит, хотя я запускаю его из командной строки:

python mp.py

Я запускаю последнюю версию Python 2.6 в Windows 7, 32 и 64 бит

15
задан krlmlr 4 February 2012 в 03:45
поделиться

3 ответа

Вам необходимо защитить точку входа в программу с помощью if __name__ == '__main__':.

Это проблема, специфичная для Windows. В Windows ваш модуль должен быть импортирован в новый интерпретатор Python, чтобы он мог получить доступ к вашему целевому коду. Если вы не остановите этот новый интерпретатор, выполняющий стартовый код, он породит еще одного ребенка, который затем породит еще одного ребенка, пока не будет pythonw.exe процессов, насколько хватает глаз.

Другие платформы используют os.fork() для запуска подпроцессов, поэтому у них нет проблемы повторного импорта модуля.

Таким образом, ваш код должен выглядеть так:

from multiprocessing import Process
import sys

def func(x):
    print 'works ', x + 2
    sys.stdout.flush()

if __name__ == '__main__':
    p = Process(target= func, args= (2, ))
    p.start()
    p.join()
    p.terminate()
    print 'done'
    sys.stdout.flush()
32
ответ дан 1 December 2019 в 01:30
поделиться

Забавно, работает на моей Linux-машине:

$ python mp.py
works  4
done
$

Предполагается, что многопроцессорность будет работать в Windows? Многие программы из мира Unix не так хорошо работают с Windows, потому что Unix использует fork (2) для довольно дешевого клонирования процессов, но (насколько я понимаю) Windows не поддерживает ] fork (2) изящно, если вообще.

1
ответ дан 1 December 2019 в 01:30
поделиться

Согласно руководствам по программированию для многопроцессорной обработки в Windows необходимо использовать if __name__ == '__main __':

2
ответ дан 1 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

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