有个人问我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