这两天出了两个事故,一个是因为正负面的接口被被人疯狂访问而变得堵塞,导致整个动态网页解析解析的崩溃,最后redis挂掉。 还有一个事情是动态ip轮询模块的bug。。。 多事之秋呀。  这几个晚上一直尝试看gevent的源代码,收获特别的大,gevent本身的一些实现就特别的灵巧,背靠这内核的epoll调度,实现一系列的io调度非堵塞。 

 

大家知道gevent是协程,协程是用户态层面自己解决io堵塞的问题,他会把每次堵塞时间都注册是epoll里面。 那么,gevent是基于单线程的实现,那么gevent本身是没有多进程的,但我们可以每个进程一组线程的方式来实现IO Bound的多进程模式。今天看了下gevent threadpool的相关代码,他的实现有点像multiprocessing threadpool 。 首先我们知道python的线程是个比较坑爹的东西,我现在的服务端架构基本是多进程加多协程的架构。 言归正传,gevent是如何实现多进程?   看了下官方的issue,有人提出用threadpool实现。  简单过了下代码,他是利用os.fork 来派生多进程的,具体的调度我就多说了,主要是在from gevent.hub import get_hub这里。 

gevent的文章,http://xiaorui.cc/?p=1530


下面是我测试的表现,效果还是可以的,计算任务跑的还算平均。 测试是在一个云主机测试的,有些片面性。 


测试的代码如下:

下面是Threadpool 的部分源代码,set_size是创建进程的数目,on_fork是fork进程,kill是干掉进程,spawn是触发进程,add_thread是增加进程。 



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!

关于gevent queue遭遇hub.LoopExit问题

我的上下文 “ gevent.hub.LoopExit: This operation would block forever”   ,   使用过gevent queue的朋友估摸会遇到这...

阅读全文

gevent通过socket补丁实现redis.py非阻塞

如题,gevent是使用socket补丁把redis.py改成异步非阻塞化. 异步非阻塞是个有点虚的话题,在python下使用gevent确实解决了io阻塞的问题。 业务场景需要pyth...

阅读全文

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

有个人问我gevent怎么实现非堵塞的系统调用,当然threading是可以实现的, 但是大家知道threading是不太可控的。 python实现系统调用的模块还是很多的,比...

阅读全文