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

业务场景需要python gevent redis.py的组合,因redis.py涉及到网络io的交互,果断的在开源社区找找gevent有关redis的模块。  


该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新.

http://xiaorui.cc/?p=3391

结果有些意思,在github中有关gevent redis的模块一共就3 4个,光看文档就知道不怎么好用。 我用gevent也有5年的年头了,还真没有特意用非阻塞的redis模块。理由是redis本身够快,以前的需求都是那种hash、zset、list的操作。但这次需求不同,大量的使用堵塞性质的命令,比如redis的brpop. 


记得gevent1.0之后就有socket补丁支持,我在想能否替换redis.py ‘ socket模块的方法来实现redis非阻塞。 最后一段折腾,先是翻看redis.py源码,找到创建连接并与连接做send、recv交互的代码,然后逐步测试,果然成功了…  只需要用gevent.socket替换redis.connection.socket就可以了。 这个替换方式也是gevent官方提倡的猴子补丁思想。

下面是gevent redis.py结合方法,  步骤简单…

下面是gevent socket代码实现

file: gevent.socket.py

大多数人还是python 2.7的.   我们看看gevent._socket2.py做了什么 .

这次不聊gevent switch hub的调度层实现源码 ,整备下次出几篇连载的文章专门死磕gevent的调度器实现。 


话说最近再写一个python的协程io调度器,越发觉得有点吃力了。 单单给自己用,那么实现起来简单。 但是封装起来就不同了,想让执行调度代码看起来美观清爽更加难上加难,各种的python黑魔法来支撑框架的友好度… 中间遇到各种的memory leak…. 


END.



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

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

关于gevent queue遭遇hub.LoopExit问题

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

阅读全文

gevent源代码分析之用gevent threadpool实现多进程任务调度

这两天出了两个事故,一个是因为正负面的接口被被人疯狂访问而变得堵塞,导致整个动态网页解析解析的崩溃,最后redis挂掉。 还有一个事情是动态ip轮询模块...

阅读全文

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

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

阅读全文