Многопроцессорная обработка Python непрерывно порождает процессы pythonw.exe без какой-либо реальной работы - PullRequest
15 голосов
/ 04 августа 2010

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

# 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-битную

Ответы [ 3 ]

32 голосов
/ 04 августа 2010

Вам нужно защитить затем точку входа в программу, используя 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()
2 голосов
/ 04 августа 2010

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

1 голос
/ 04 августа 2010

Забавно, работает на моем Linux-компьютере:

$ python mp.py
works  4
done
$

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...