Как перенаправить вывод на печать из многопроцессорного пула - PullRequest
2 голосов
/ 17 июня 2020

Как я могу перенаправить отпечатки, которые происходят в многопроцессорном пуле, в StringIO()

Я перенаправляю sys.stdout в StringIO(), это хорошо работает, пока я не использую pool из библиотеки multiprocessing.

Этот код игрушки является примером:

import io
import sys
from multiprocessing import Pool

print_file = io.StringIO()
sys.stdout = print_file

def a_print_func(some_string):
    print(some_string)

pool = Pool(2)  
out = pool.map(a_print_func, [['test_1','test_1'],['test_2','test_2']])

a_print_func('no_pool')
print('no_pool, no_func')

fd = open('file.txt', 'w')
fd.write(print_file.getvalue())
fd.close()

file.txt содержит только:

no_pool
no_pool, no_func

вместо:

test_1
test_1
test_2
test_2
no_pool
no_pool, no_func

1 Ответ

1 голос
/ 17 июня 2020

Вот решение для направления вывода всех дочерних процессов в один файл с использованием инициализатора:

import io
import sys
from multiprocessing import Pool

print_file = io.StringIO()

print_file = open("file.txt", "w")

def a_print_func(some_string):
    print(some_string)

def foo(*args):
    sys.stdout = print_file

pool = Pool(2, initializer = foo)  
out = pool.map(a_print_func, [['test_1','test_1'],['test_2','test_2']])

a_print_func('no_pool')
print('no_pool, no_func')

Результат программы:

no_pool
no_pool, no_func

И, содержимое file.txt в конце выполнения:

['test_1', 'test_1']
['test_2', 'test_2']
...