Python 如何从多处理池重定向打印输出
如何将多处理池中出现的打印重定向到Python 如何从多处理池重定向打印输出,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,如何将多处理池中出现的打印重定向到StringIO() 我正在将sys.stdout重定向到StringIO(),只要我不使用多处理库中的池,就可以正常工作 此玩具代码是一个示例: 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
StringIO()
我正在将sys.stdout
重定向到StringIO()
,只要我不使用多处理库中的池
,就可以正常工作
此玩具代码是一个示例:
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']
这回答了你的问题吗@我看不出有多准确。另外,线程锁的使用不会取消多处理方面吗?因为内存在进程之间不共享,所以对象“print_file”在父进程和子进程之间不共享。因此,父级看不到子级写入打印文件的内容。@AnarKi您必须使用多处理
锁。如果愿意,可以通过多种方法将所有子进程定向到一个文件。这是否回答了您的问题?如果使用打印文件=io.StringIO()
,则此方法无效。你知道为什么会这样,以及如何解决这个问题吗?每个子进程都可以有自己的StringIO输出,但它们不能完全共享。StingIO在内存中,除非您找到在多个进程之间共享StringIO使用的内存的方法,否则您无法做到这一点。您可以做的是在每个子进程上都有一个StringIO,并将其打印到该子进程末尾的某个文件中。或者,父进程可以捕获子进程的stdout,并对其执行任何操作。