但我无法得到我的命令的结果(标准输出)......
ConnectedCommand
(由envoy.connect()
) 返回的类型似乎还没有准备好。特别是,如果命令接收/生成足够的(取决于平台)输入/输出,则该命令可能会死锁。
除了调用c.block()
也适用于活动进程;您可以删除对该命令的所有引用并用于del c
收割僵尸。如果子进程没有死;在下一个子进程开始时运行清理方法之前,它们不会被收割(这取决于实现)。
如果envoy.run()
能力不足以完成您的任务;你可以直接使用subprocess
模块。例如,将输入传递给多个进程并收集相应的结果;你可以使用ThreadPool
和.communicate()
方法:
#!/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)
无论原始顺序如何,孩子睡得越少,父母就可以越早获得结果。
没有僵尸,如果输入/输出超过管道缓冲区,它不会死锁。