Python 2.7.3 中不会出现以下问题。但是,我的机器(64 位 Mac OSX 10.7.3)上的 Python 2.7.1 和 Python 2.6 都会出现这种情况。这是我最终将分发的代码,所以我想知道是否有任何方法可以完成这项任务,而不是过于依赖 Python 版本。
我需要并行打开多个子进程并将 STDIN 数据写入每个子进程。通常我会使用该Popen.communicate
方法来执行此操作。但是,communicate
每当我同时打开多个进程时,就会出现死锁。
import subprocess
cmd = ["grep", "hello"]
processes = [subprocess.Popen(cmd, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for _ in range(2)]
for p in processes:
print p.communicate("hello world\ngoodbye world\n")
如果我将进程数更改为for _ in range(1)
,则输出与预期一样:
('hello world\n', '')
但是,当有两个进程 ( for _ in range(2)
) 时,进程会无限期地阻塞。我尝试过手动写入标准输入的替代方法:
for p in processes:
p.stdin.write("hello world\ngoodbye world\n")
但是任何从进程中读取的尝试,(p.stdout.read()
例如)仍然是死锁。
起初这似乎是相关的,但它指定它在使用多个线程时发生,并且死锁仅很少发生(而这里总是发生)。有没有办法让它在 2.7.3 之前的 Python 版本上工作?