在python中使用gevent subprocess实现shell调用

有个人问我gevent怎么实现非堵塞的系统调用,当然threading是可以实现的, 但是大家知道threading是不太可控的。 python实现系统调用的模块还是很多的,比如subprocess,os popen,commands等。  现在高并发的服务基本都是这种协程实现的。 协程是个用户态的东西,相比线程的时间片的调度来说,他可以自己控制调度,基于事件的方式来监控堵塞的回调。 

gevent在1.0之后,支持的socket和subprocess的模块, 我测试过效率,线程的数目达到100后,有时候会出现少许的崩溃,但是用gevent的subprocess,不会出现这样的情况,及其的稳定。  我 gevent很有感觉,像以前写监控系统的服务端, 分布式的rpc调度,爬虫。。。。 

#coding:utf-8
from gevent.pool import Pool
from gevent.subprocess import Popen, PIPE
import os
import sys
import gevent

def worker():
    print 'start'
    sub = Popen(['sleep 10'], stdout=PIPE, shell=True)
#    sub = Popen(['top'], stdout=PIPE, shell=True)
    out, err = sub.communicate()
    print 'end'
    return out.rstrip()

def run():
    for i in range(10):
        print i
        g = gevent.spawn(worker)
    g.join()

if '__main__' == __name__:
    '''耗时 10.0609869957
    '''
    import time
    start_at = time.time()
    run()
    print time.time() - start_at

下面是执行后的结果,可以判定gevent subprocess没有发现堵塞的情况,是并发进行的。 

[ruifengyun@devops ~ ]$ python sub.py
0
1
2
3
4
5
6
7
8
9
start
start
start
start
start
start
start
start
start
start
end
end
end
end
end
end
end
end
end
end


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

邮箱地址不会被公开。 必填项已用*标注