起因,我这边有个服务端,是专门控制服务发现和注册功能,任务的调度都是用gevent来实现,如果直接在gevent里使用python-etcd,会发生阻塞的,gevent对于那些网络模块很是敏感。 我不打算在任务调度器里面用多线程,所以我直接自己重写个支持gevent的python etcd模块。
(python-etcd是用urllib2开发的,虽然gevent有urllib2的patch,但我不打算在python-etcd里面开发含有gevent逻辑的分支 。 对于我这种天天折腾爬虫的人来说,gevent urllib2不是个好选择,有不少的坑,大多数人还是推荐gevent requests的组合。 )
额外提一句,etcd真是个小而精的东西,轻松的实现服务发现,但etcd这东西坑也真是不少 ! 其中最让人恼火的是在watch key过多的情况下,出现各种异常,给etcd提交了issue,结果….. 当我没说,继续看下面 !
关于gevent etcd客户端,原文地址是 http://xiaorui.cc/2015/10/12/%E7%94%A8gevent%E5%BC%80%E5%8F%91%E9%9D%9E%E9%98%BB%E5%A1%9E%E7%9A%84etcd-python%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%A8%A1%E5%9D%97/
利用周六周天的时间开发了etcd客户端,但功能有些简单,再说我自己也没想法把他做的很复杂。 已经把项目打包到pypi了,有兴趣的朋友可以测试下。
项目名: gevent-etcd
地址: https://github.com/rfyiamcool/gevent-etcd
介绍:
gevent-etcd 是一个使用gevent requests封装的python client模块. gevent-etcd用来解决在多任务并发下有io阻塞的情况. 要知道在github中有不少etcd的python模块,但是基本用都采用urllib http模块.跟gevent不怎么兼容. 虽然可以利用threading 、multiprocessing进行并发处理,但gevent协程的好处,我想大家知道!
我个人的看法,在网络io阻塞的问题上,能用协程坚决不用多线程.
另外,gevent-etcd的功能还很简单,期待有人提交pull request ,这项目简单易懂,很容易就加入的。
gevent-etcd模块的用法:
pypi安装
pip install gevent_etcd
通过github来源码安装
git clone https://github.com/rfyiamcool/gevent-etcd.git cd gevent-etcd python setup.py install
现在存在的问题,不间断的watch有些问题,watch的功能还比较的简单,选举功能没有,也不打算开发集群管理的功能。
有兴趣的朋友,可以跟我一起开发。
etcd就那性能你还gevent?