通常,Unix 中的管道用于连接两个命令,并将第一个命令的输出用作第二个命令的输入。但是,我最近提出了使用管道并行运行多个命令的想法(这可能不是新的,但我没有找到太多谷歌搜索),如下所示:
command1 | command2
如果不从标准输入读取并且不写入标准输出,这将并行调用command1
和。说明这一点的最小示例是(请在交互式 shell 中运行它)command2
command2
command1
ls . -R 1>&2|ls . -R
我的问题是,使用管道以这种方式并行执行两个命令有什么缺点吗?这个想法有什么我遗漏的吗?
非常感谢您提前。
命令管道已经并行运行。使用命令:
两者
command1
都command2
启动。如果command2
已调度且管道为空,则会阻塞等待读取。如果command1
尝试写入管道并且它已满,command1
则阻塞直到有写入空间。否则,两者command1
和command2
并行执行,写入和读取管道。有缺点...
command1
command2
不读取 的输出command1
,后者将在写入一定数量的输出后挂起(我见过 4K,但实验上,对于 python 进程来说,限制至少在 58K 左右,见下文)。这可能取决于command1
.command2
之前停止command1
并command1
写入其标准输出,它将得到[Errno 32] Broken pipe
实验:
cmd1 命令2跑:
你会看见:
cmd1
在迭代 58 处停止(因为 cmd2 从不从其输出中读取任何内容)cmd1
cmd2 退出时崩溃(管道损坏)所以是的,也许它可以工作。也许不是。