Многопроцессорность 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 бит

Ответы

Ответ 1

Вам нужно защитить точку входа в программу с помощью 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()

Ответ 3

Смешно, работает на моей машине Linux:

$ python mp.py
works  4
done
$

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