You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将两个持续生成日志的程序并行管道至同一Python程序?

解决方案:并发合并两个进程的输出到管道

你的问题出在串行执行逻辑上:{ ./log1; ./log2; }会先完整运行log1(直到它主动终止)才会启动log2,但log1是持续运行的程序,所以log2根本没机会启动,自然无法输出日志到program.py

要让两个进程并发运行并将它们的输出实时合并到同一个管道,你需要用后台执行符&让两个进程同时启动,再把它们的输出汇总到管道。以下是几种可行的方案:

基础方案:后台并发运行

直接让两个日志程序在后台启动,它们的标准输出会自动合并到管道中:

( ./log1 & ./log2 & wait ) | python program.py
  • ( ... ) 创建子shell,把两个后台进程封装在其中
  • &log1log2在后台并发运行,互不阻塞
  • wait 等待两个后台进程全部终止(避免子shell提前退出,确保管道持续接收输出)

优化方案:解决缓冲问题(确保实时输出)

很多程序在标准输出不是终端时,会启用块缓冲(而非行缓冲),导致日志不会实时传输到program.py。你可以用stdbuf强制开启行缓冲,让每一行日志都立即被推送:

( stdbuf -oL ./log1 & stdbuf -oL ./log2 & wait ) | python program.py
  • -oL 参数表示对标准输出启用行缓冲,保证日志产生后立刻进入管道

简洁写法(按需选择)

如果你不需要等待进程终止(比如会手动终止所有进程),也可以省略wait,写法更简洁:

( ./log1 & ./log2 & ) | python program.py

这样配置后,log1log2会同时运行,它们的日志会按产生顺序交替(或并发)地进入program.py的标准输入,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Morgan Kohler

火山引擎 最新活动