Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用特使.connect避免僵尸进程?_Python_Subprocess_Popen_Python Envoy - Fatal编程技术网

Python 如何使用特使.connect避免僵尸进程?

Python 如何使用特使.connect避免僵尸进程?,python,subprocess,popen,python-envoy,Python,Subprocess,Popen,Python Envoy,我刚刚发现了“特使”模块,它是请求创建者为python子流程编写的包装器 我对“connect”函数有一个问题:每次我使用它时,它都会导致一个僵尸进程,我无法获取状态代码或结果 c=envoy.connect("ls -al") c.status_code == None True 如果我做一个“ps-ef | grep thepid”,我会得到一个“失效”的pid 我可以通过执行os.wait()或c.\u process.wait()杀死僵尸,但我无法获得命令的结果(stdout) 有什

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

我对“connect”函数有一个问题:每次我使用它时,它都会导致一个僵尸进程,我无法获取状态代码或结果

c=envoy.connect("ls -al")
c.status_code == None
 True
如果我做一个“ps-ef | grep thepid”,我会得到一个“失效”的pid

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


有什么想法吗?

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

正如特使文件建议的那样:

r = envoy.run(cmd)
print r.status_code, r.std_out
但是,如果希望命令异步运行,可以使用
connect()
后跟
block()

调用
block()
后,返回代码变为可用。但是block()会阻塞程序,因此逻辑应该是正确的

c1=envoy.connect(cmd1)
c2=envoy.connect(cmd2)
c3=envoy.connect(cmd3)
... more staff ...
c1.block()
print c1.status_code
但是我不能得到我命令的结果(stdout)

(由
特使.connect()
返回的类型)似乎未就绪。特别是,如果命令接收/生成足够多(取决于平台)的输入/输出,则该命令可能会死锁

除了调用同样适用于活动进程的
c.block()
;您可以删除对该命令的所有引用,并使用
delc
获取僵尸。如果子进程没有死;只有在下一个子流程开始时运行清理方法(这取决于实现)时,才能获得这些结果

如果
特使.run()
功能不足以完成任务;您可以直接使用
子流程
模块。例如,将输入传递给多个流程并收集相应的结果;您可以使用
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)
孩子睡得越少,其结果就越快提供给家长,而不管最初的顺序如何


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

run()工作正常,但我想使用connect()来实现非阻塞进程。我的脚本必须启动十分之一的命令。“ls-al”就在这里作为例子。实际的命令几乎需要一分钟才能发送结果…是的,我理解。修复了答案,看看是否有帮助。
.block()
的+1
del c1
也会带来僵尸进程的收获。在深入研究我的问题后,我认为它与平台/python转换相关:我在Solaris10(x86)上使用python 2.6,并且使用En特使提供的测试用例不起作用。c=特使连接(“睡眠1”)时间。睡眠(2)self.assertEqual(c.status_代码,0)==>保持僵尸进程和“无”状态_代码。不幸的是,我没有办法升级python,因为它依赖于其他团队。我正在linux机器上做一些测试。。。