设为首页 收藏本站
查看: 1706|回复: 0

[经验分享] OpenStack协同并发 eventlet

[复制链接]

尚未签到

发表于 2015-4-12 14:49:11 | 显示全部楼层 |阅读模式
  今天听easystack一哥们讲nova协同并发,结合自己之前的认识。回顾一下openstack eventlet。
  OpenStack作为热门的开源云平台,本身代码当然得支持高并发。
  首先讲讲python的并发,python中的并发有:进程、线程、协程(Coroutines)。
  进程和线程大家都比较清楚了,那什么是协程,协程介绍如下:


  • 协程和线程比较像,每个协程都有?己的私有stack和局部变量
  • 一个线程内可以有很多个协程
  • 多个线程可以同时运行。但在一个线程内,同一时间只有一个协程在运行,无须对某些共享变量加锁
  • 协程之间的执行顺序,完全由程序来控制
  • 除非自己放弃执行,否则一直执行到结束
  • 协程是一种概念,非操作系统可见,在多种语言中实现,如go、ruby等。eventlet是Python中实现之一
  进程、线程、协程之间的关系可以用下图表示:
   DSC0000.png
  eventlet是对greenlet的封装,先了解下greenlet,下面是一个官方给出的例子:



1 from greenlet import greenlet
2
3 def test1():
4     print 12
5     gr2.switch()
6     print 34
7
8 def test2():
9     print 56
10     gr1.switch()
11     print 78
12
13 gr1 = greenlet(test1)
14 gr2 = greenlet(test2)
15 gr1.switch()
  执行结果是:



12
56
34
  程序很简单,定义两个协程,最后一行g1.switch()跳转到 test1() ,它打印12,然后跳转到 test2() ,打印56,然后跳转回 test1() ,打印34,然后 test1() 就结束,gr1死掉,回到父greenlet,不会再切换到test2,所以不会打印78。在上面的例子中main greenlet就是它们的父greenlet。
  greenlet使用虽然简单,但是需要程序员显式的写代码在不同的协程之间切换,对于OpenStack这样的大项目显然是不现实的。
  于是eventlet封装了greenlet,以下是eventlet的介绍:


  • 由second life开源的高性能网络库
  • 基于greenlet
  • 通过patch标准模块实现协程
  • 对greenlet封装,提供GreenThread
  • 内部使用timer实现greenlet调度器
  • 内部main loop 循环通过最小堆查找应该执行的greenlet
  python 2.x 原生是不支持协程的,eventlet通过对标准库打patch实现协程,例如在Nova项目中 nova/cmd/__init__.py



import eventlet
from nova import debugger
if debugger.enabled():
# turn off thread patching to enable the remote debugger
eventlet.monkey_patch(os=False, thread=False)
else:
eventlet.monkey_patch(os=False)
  其中eventlet.monkey_patch()就是对标准库打patch。
  在调试Nova代码时,有时会因为协程导致调试不方便,可以把else语句里面的eventlet.monkey_patch(os=False)改为eventlet.monkey_patch(os=False, thread=False)
  在eventlet的文档中有关于eventlet的使用,主要包含以下几个接口:
  (1) spawn(func, *args, **kw)
启动一个greenthread来调用func函数,args和kw都是传递给func的参数。返回值是greenthread.GreenThread对象
(2) spawn_n(func, *args, **kw)
除了没有返回值,其他跟spawn一样
(3) spawn_after(seconds, func, *args, **kw)
在seconds秒之后启动
(4) sleep(seconds=0)
暂停当前greenthread,给其它greenthread执行的机会
  
  参加资料:
  http://greenlet.readthedocs.org/en/latest/
  http://eventlet.net/doc/basic_usage.html
  http://blog.iyunv.com/hackerain/article/details/7836993
  http://www.choudan.net/2013/08/18/OpenStack-eventlet%E5%88%86%E6%9E%90(%E4%B8%80).html
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-56348-1-1.html 上篇帖子: openstack云5天资料 下篇帖子: OpenStack official programs
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表