[英]Dealing with multiple subprocesses writing to stdout in python
我有多个子进程(用subprocess.Popen
打开)不断地向标准输出(几 MB/秒)写入大量短行。
有时,我猜想当两个子进程同时写入 stdout 时,stdout 中的 output 是一个不可读的行。
例如,子进程 1 写入 AAAA,子进程 2 写入 BBBB,而标准输出有时会显示 AABABABB,而不是截然不同的 AAAA 和 BBBB。
如何捕获子进程的 output 并将它们重定向到标准输出,同时避免导致不可读的 output 的冲突?
我目前正在将子进程的 output 写入文件(每个子进程一个),但我宁愿将 output 写入标准输出!
import argparse, sys, json
from subprocess import Popen, PIPE
from multiprocessing import cpu_count
# Process parameters
parser = argparse.ArgumentParser()
parser.add_argument('--cmd', type=str, help='command to be executed', required=True)
parser.add_argument('--pattern', type=str, help='pattern for the output files', required=True)
args = parser.parse_args()
# Create worker subprocesses and open output files
processes,files = [],[]
for i in range(cpu_count()):
f = open(args.pattern.replace('{}',f'{i:02}'),'w')
p = Popen(json.loads(args.cmd), stdout=f, stdin=PIPE)
processes.append(p)
files.append(f)
# Traiter le flux stdin
i = 0 # index of the next subprocess to feed with stdin
for line in sys.stdin:
p = processes[i]
p.stdin.write(line.encode())
p.stdin.flush()
i += 1
if i==len(processes):
i = 0
# Close output files
for i in range(cpu_count()):
f = files[i]
f.close()
这是一个共享资源问题。 您有多个进程争夺共享资源(屏幕)。 除非你强制同步,否则文本会乱码。
我建议像您已经完成的那样将它放入单独的文件中,如果您想查看实时运行的 output,请对目录中的所有文件执行tail -f *
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.