首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用envoy.connect避免僵尸进程?

如何使用envoy.connect避免僵尸进程?
EN

Stack Overflow用户
提问于 2013-12-02 13:22:59
回答 2查看 344关注 0票数 1

我刚刚发现了“特使”模块,这是请求创建者为python子进程编写的一个包装器。

我对'connect‘函数有一个问题:每次我使用它时,它都会导致一个僵尸进程,而我无法获得status_code或结果。

代码语言:javascript
复制
c=envoy.connect("ls -al")
c.status_code == None
 True

如果我做了一个'ps -ef|grep‘pid,我得到一个’失效‘pid。

我可以通过执行os.wait()或c._process.wait()来杀死僵尸,但是我无法获得命令的结果(stdout) .

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2013-12-02 14:41:39

在您的情况下,您应该使用run()方法

正如特使文件所建议的:

代码语言:javascript
复制
r = envoy.run(cmd)
print r.status_code, r.std_out

但是,如果您希望该命令异步运行,则可以使用connect() ,然后是

一旦调用了block(),返回代码就可用了。但是block()会阻塞您的程序,因此逻辑应该是。

代码语言:javascript
复制
c1=envoy.connect(cmd1)
c2=envoy.connect(cmd2)
c3=envoy.connect(cmd3)
... more staff ...
c1.block()
print c1.status_code
票数 1
EN

Stack Overflow用户

发布于 2013-12-04 00:12:45

但我无法得到我命令的结果.

ConnectedCommand (envoy.connect()返回的类型)似乎还没有准备好。特别是,如果该命令接收/生成足够多的输入/输出(取决于平台),它就会陷入死锁。

除了调用同样适用于活动进程的c.block()之外,您还可以删除对命令的所有引用,并使用del c来获取僵尸。如果子进程没有死;在下一个子进程开始运行清理方法之前,它们不会被捕获(这取决于实现)。

如果envoy.run()功能不足以完成任务,则可以直接使用subprocess模块。例如,要将输入传递给几个进程并收集相应的结果,可以使用ThreadPool.communicate()方法:

代码语言:javascript
复制
#!/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)

子睡眠越少,其结果就越早提供给父级,而不管最初的顺序如何。

没有僵尸,如果输入/输出超过管道缓冲区,它也不会死锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20329389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档