У меня есть проблема с кодом ниже, и с любым кодом, который использует 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
Можно ли указать на меня на решение?Заранее спасибо.
Попробуйте так:
from multiprocessing import Process
import sys
def f(name):
print 'hello', name
sys.stdout.flush()
...
AFAIK стандартный вывод обработанных процессов, порожденных модулем multiprocessing
, буферизован, поэтому вы увидите вывод только тогда, когда буфер станет полным или вы явно промоете sys.stdout
.
Документация по мультипроцессингу четко объясняет, почему это не будет работать!
"Примечание: Функциональность в рамках этого пакета требует, чтобы метод __main__ был импортируемым для дочерних пакетов. Это описано в руководстве по программированию, однако здесь на это стоит обратить внимание. Это означает, что некоторые примеры, такие как примеры multiprocessing.Pool, не будут работать в интерактивном интерпретаторе."
.