【发布时间】:2013-01-14 22:41:04
【问题描述】:
在 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())仍然会死锁。
起初this 似乎是相关的,但它指定它在使用多个线程时发生,并且死锁很少发生(而这里总是发生)。有没有办法让它在 2.7.3 之前的 Python 版本上工作?
【问题讨论】:
标签: python python-2.7 multiprocessing subprocess