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

python windows process multiprocessing

5044 просмотра

3 ответа

172 Репутация автора

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

# 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 Источник Размещён: 04.08.2010 12:19

Ответы (3)


1 плюс

91607 Репутация автора

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

$ python mp.py
works  4
done
$

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

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

2 плюса

317 Репутация автора

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

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

32 плюса

163325 Репутация автора

Решение

Вы должны защитить затем точку входа в программу с помощью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
Вопросы из категории :
32x32