<blockquote>
<p>but I can't get the result (stdout) of my command...</p>
</blockquote>
<p><a href="https://github.com/kennethreitz/envoy/blob/a02ad4c7e1021e4443e3e4edc87715182c23f85f/envoy/core.py#L100" rel="nofollow">^{<cd1>}</a>(由<code>envoy.connect()</code>返回的类型)似乎没有准备好。特别是,如果命令接收/生成足够的(取决于平台)输入/输出,则该命令可能会死锁。在</p>
<p>除了调用同样适用于活动进程的<code>c.block()</code>之外,还可以删除对该命令的所有引用,并使用<code>del c</code>来获取僵尸。如果子进程没有死,则在下一个子进程开始时运行清理方法(取决于实现)之前,不会获取这些子进程。在</p>
<p>如果<code>envoy.run()</code>功能不足以完成您的任务,则可以直接使用<code>subprocess</code>模块。例如,要将输入传递给多个进程并收集相应的结果,可以使用<code>ThreadPool</code>和<code>.communicate()</code>方法:</p>
<pre><code>#!/usr/bin/env python
from multiprocessing.pool import ThreadPool
from subprocess import Popen, PIPE
def process(child_input):
child, input = child_input # unpack arguments
return child.communicate(input)[0], child.returncode # get the result
# define input to be pass to subprocesses
params = b"a b c".split()
# start subprocesses (the command is just an example, use yours instead)
children = [Popen("( echo -n {0}; sleep {0}; cat )".format(len(params) - i),
shell=True, stdin=PIPE, stdout=PIPE)
for i in range(len(params))]
# use threads to wait for results in parallel
pool = ThreadPool(len(params))
for output, returncode in pool.imap_unordered(process, zip(children, params)):
if returncode == 0:
print("Got %r" % output)
</code></pre>
<p>不管最初的顺序如何,孩子睡得越少,其结果就越快提供给父母。在</p>
<p>如果输入/输出超过管道缓冲区,它不会死锁。在</p>