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