Дочерние процессы, созданные с помощью многопроцессорного модуля Python, не будут печататься - PullRequest
18 голосов
/ 05 мая 2010

У меня проблема с кодом ниже и с любым кодом, который использует функцию print в дочерних процессах. Я не вижу никаких печатных заявлений, даже если я использую sys.std[err|out].write('worker') вместо print.

Это код ( из официальной документации Python ):

from multiprocessing import Process

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

Выход пуст.

Примечание : в следующем коде используется модуль потоков и распечатывается вывод:

import threading

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = threading.Thread(target=f, args=('bob',))
    p.start()
    p.join()

Выход : hello bob

Не могли бы вы указать мне решение? Заранее спасибо.

Ответы [ 2 ]

28 голосов
/ 05 мая 2010

Попробуйте это:

from multiprocessing import Process
import sys

def f(name):
    print 'hello', name
    sys.stdout.flush()

...

AFAIK буферизуется стандартный вывод обработанного, порожденного модулем multiprocessing, следовательно, вы увидите вывод, только если буфер заполнится или вы явно сбросите sys.stdout.

6 голосов
/ 11 мая 2010

Документы для многопроцессорной обработки четко объясняют , почему это не сработает!

"Примечание. Функциональность в этом пакете требует, чтобы метод __main__ был импортирован детьми. Это описано в Руководстве по программированию, однако на это стоит обратить внимание. Это означает, что некоторые примеры, такие как мультипроцессинг. работа в интерактивном переводчике. "

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