今天听easystack一哥们讲nova协同并发,结合自己之前的认识。回顾一下openstack eventlet。

OpenStack作为热门的开源云平台,本身代码当然得支持高并发。

首先讲讲python的并发,python中的并发有:进程、线程、协程(Coroutines)。

进程和线程大家都比较清楚了,那什么是协程,协程介绍如下:

  • 协程和线程比较像,每个协程都有⾃己的私有stack和局部变量
  • 一个线程内可以有很多个协程
  • 多个线程可以同时运行。但在一个线程内,同一时间只有一个协程在运行,无须对某些共享变量加锁
  • 协程之间的执行顺序,完全由程序来控制
  • 除非自己放弃执行,否则一直执行到结束
  • 协程是一种概念,非操作系统可见,在多种语言中实现,如go、ruby等。eventlet是Python中实现之一

进程、线程、协程之间的关系可以用下图表示:

eventlet是对greenlet的封装,先了解下greenlet,下面是一个官方给出的例子:

 from greenlet import greenlet

 def test1():
print 12
gr2.switch()
print 34 def test2():
print 56
gr1.switch()
print 78 gr1 = greenlet(test1)
gr2 = greenlet(test2)
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.csdn.net/hackerain/article/details/7836993

http://www.choudan.net/2013/08/18/OpenStack-eventlet%E5%88%86%E6%9E%90(%E4%B8%80).html

OpenStack协同并发 eventlet的更多相关文章

  1. 玩转Openstack之Nova中的协同并发(二)

    玩转Openstack之Nova中的协同并发(二) 昨天介绍了Python中的并发处理,主要介绍了Eventlet,今天就接着谈谈Openstack中Nova对其的应用. eventlet 在nova ...

  2. 玩转Openstack之Nova中的协同并发(一)

    玩转Openstack之Nova中的协同并发(一) 前不久参加了个Opnstack的Meetup,其中有一个来自EasyStack的大大就Nova中的协同并发做了一番讲解,有所感触,本想当天就总结一下 ...

  3. openstack中eventlet使用

    openstack中使用eventlet的协程来实现并发. 第一种,使用eventlet.GreenPool来管理绿色线程 如l3-agent在开启了8个绿色线程来处理router消息 def _pr ...

  4. 【OpenStack】OpenStack系列1之Python虚拟环境搭建

    安装virtualenv相关软件包 安装:yum install python-virtualenv* -y 简介,安装包主要包括, python-virtualenv:virtualenv用于创建独 ...

  5. openstack私有云布署实践【5 数据库MariaDB 集群】

    kxcontroller1   kxcontroller2  controller1 这3台作角色 确保服务器的域名解析访问正常   确保NTP时间同步   配置HAproxy主备访问,其中的一项数据 ...

  6. 【转】高性能服务器架构(High-Performance Server Architecture)

    High-Performance Server Architecture 高性能服务器架构 来源:http://pl.atyp.us/content/tech/servers.html译文来源:htt ...

  7. Python Twisted系列教程20: Twisted和Erlang

    作者:dave@http://krondo.com/twisted-and-erlang/  译者: Cheng Luo 你可以从”第一部分 Twist理论基础“开始阅读:也可以从”Twisted 入 ...

  8. 高性能服务器架构 的几个注意点 (High-Performance Server Architecture)

    High-Performance Server Architecture 高性能服务器架构 来源:http://pl.atyp.us/content/tech/servers.html译文来源:htt ...

  9. python之高性能网络编程并发框架eventlet实例

    http://blog.csdn.net/mingzznet/article/details/38388299 前言: 虽然 eventlet 封装成了非常类似标准线程库的形式,但线程和eventle ...

随机推荐

  1. Silverlight获取DataGrid选中的行数据

    注意触发的事件为:CurrentCellChanged后台代码: /// <summary> /// 获取datagrid当前选中的单元格数据 /// 如果绑定的数据源为实体的话默认选中的 ...

  2. js脚本同步、异步与延迟

    一般,我们通过src引入js文件时建议在页面末尾引入,因为会阻塞页面的渲染.defer和async可以达到同样效果 当HTML解析器遇到<script>元素时,它必须先执行脚本,然后再恢复 ...

  3. “/”应用程序中的服务器错误。 / c:\windows\temp目录权限设置

    说明: 1 对该目录的权限是ASP.net生成编译运行的临时文件需要,ASP不需要这个目录是因为ASP的脚本代码是解释执行. 2 Windows2003默认的设置是可以正常运行ASP.net的,造成问 ...

  4. 这是一个在Windows live 上实验的文章

    这是一个windows 实验用的文章,希望一次成功

  5. hp-ux-ia64:jffi/ffi 编译总结

    在HP-UX-IA64下编译JFFI及FFI遇到很多问题,官网jffi文档中也并没有在hp-ux-ia64平台上有编译过. 次文档仅为记录之用.记录编译过程,但并不意味着本人遇到的问题已经解决. 注意 ...

  6. Linux shell 之 提取文件名和目录名的一些方法

    很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等.例如,从路径/dir1/dir2/file.tx ...

  7. eclipse打开一闪而过,环境安装正确

    一:查看错误信息 开始,运行->cmd.execd 进入eclipse目录D:\JavaTools\eclipse\eclipse.exe>eclipsec.exe,看console输出是 ...

  8. SKPhysicsJointSpring类

    继承自 NSObject 符合 NSCoding(SKPhysicsJoint)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit. ...

  9. Interpolator 插值器

    简介 Interpolator:撺改者,校对机,分类机,插补器 Interpolator 定义了动画的变化速度,可以实现匀速.正加速.负加速.无规则变加速等,这使得基本的动画得以实现加速.减速等效果. ...

  10. codevs 4650 破损的键盘(链表)

    /* 之前一直不重视链表 (好吧说实话主要是看着板子都是指针就怂了T.T) 这道题比较基础 应用了链表的思想 数组模拟指针 遇到的问题就是跑着跑着光标跳到前面或者跳到后面 我们用next储存每个点下一 ...