如何将多处理池中发生的打印重定向到StringIO()
我正在将sys.stdout
重定向到StringIO()
,只要我不使用multiprocessing
库中的pool
,就可以很好地工作。
这个玩具代码就是一个例子:
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
下面是使用初始值设定项将所有子进程的输出定向到单个文件的解决方案:
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']