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

python windows process multiprocessing

5044 просмотра

3 ответа

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

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

Автор: lj8888 Источник Размещён: 12.11.2019 09:37

Ответы (3)


32 плюса

Решение

Вы должны защитить затем точку входа в программу с помощью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()
Автор: Dave Webb Размещён: 04.08.2010 12:31

2 плюса

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

Автор: macedoine Размещён: 04.08.2010 12:29

1 плюс

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

$ python mp.py
works  4
done
$

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

Автор: sarnold Размещён: 04.08.2010 12:28
Вопросы из категории :
32x32