OpenStack协同并发 eventlet

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

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

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

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

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

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

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.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

时间: 2024-12-29 10:58:08

OpenStack协同并发 eventlet的相关文章

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

玩转Openstack之Nova中的协同并发(二) 昨天介绍了Python中的并发处理,主要介绍了Eventlet,今天就接着谈谈Openstack中Nova对其的应用. eventlet 在nova/cmd/__init__.py中,就直接调用了eventlet的方法,代码如下: 1 from nova import debugger 2 3 if debugger.enabled(): 4 eventlet.monkey_patch(os=False, thread=False) 5 els

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

玩转Openstack之Nova中的协同并发(一) 前不久参加了个Opnstack的Meetup,其中有一个来自EasyStack的大大就Nova中的协同并发做了一番讲解,有所感触,本想当天就总结一下,但是由于前段时间工作上比较忙,加上为了履行诺言每天几更的来写设计模式系列性文章,故而拖到今天才写此次的总结.好吧,其实归根结底还是自己太懒了,趁着闲时在补新番小笼包之类的.废话就此打住,开始正文. Python中协程的介绍 在此之前,先介绍下Python中的并发,在Python中,并发有三种,分别

玩转Openstack之Nova中的协同并发(二) · voidy

玩转Openstack之Nova中的协同并发(二) 昨天介绍了Python中的并发处理,主要介绍了Eventlet,今天就接着谈谈Openstack中Nova对其的应用. ##eventlet 在nova/cmd/init.py中,就直接调用了eventlet的方法,代码如下: from nova import debugger if debugger.enabled(): eventlet.monkey_patch(os=False, thread=False) else: eventlet.

openstack中eventlet使用

openstack中使用eventlet的协程来实现并发. 第一种,使用eventlet.GreenPool来管理绿色线程 如l3-agent在开启了8个绿色线程来处理router消息 def _process_routers_loop(self): pool = eventlet.GreenPool(size=8) while True: pool.spawn_n(self._process_router_update) 第二种是在oslo.messaging中创建接消息的进程直接创建绿色线程

中小企业openstack私有云布署实践【5 数据库MariaDB 集群】

kxcontroller1   kxcontroller2  controller1 这3台作角色 确保服务器的域名解析访问正常 确保NTP时间同步 配置HAproxy主备访问,其中的一项数据库3306端口项,参考Haproxy配置文档. 每台安装如下包 ---------------------------------------------------------------------- 201511月的安装包如下 yum install -y  mariadb-galera-server

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

High-Performance Server Architecture 高性能服务器架构 来源:http://pl.atyp.us/content/tech/servers.html译文来源:http://www.lupaworld.com/home/space-341888-do-blog-id-136718.html (map注:本人看了一遍,“于我心有戚戚焉”,翻译得也很好,于是整理了一下,重新发布,备忘) 引言 本文将与你分享我多年来在服务器开发方面的一些经验.对于这里所说的服务器,更

高性能服务器设计[转自腾讯km,由qzhang同学翻译]

最近在升级一个服务组件,写到一半突然想起,何不先到km里面去挖挖矿,之后就发现此文,倍感珍贵,强行(违规)分享出来…… 引言本文将与你分享我多年来在服务器开发方面的一些经验.对于这里所说的服务器,更精确的定义应该是每秒处理大量离散消息或者请求的服务程序,网络服务器更符合这种情况,但并非所有的网络程序都是严格意义上的服务器.使用“高性能请求处理程序”是一个很糟糕的标题,为了叙述起来简单,下面将简称为“服务器”. 本文不会涉及到多任务应用程序,在单个程序里同时处理多个任务现在已经很常见.比如你的浏览

Python Twisted 学习系列20(转载stulife最棒的Twisted入门教程)

第二十部分 轮子中的轮子: Twisted和Erlang 简介 在这个系列中,有一个事实我们还没有介绍,即混合同步的"普通Python"代码与异步Twisted代码不是一个简单的任务,因为在Twisted程序中阻滞不定时间将使异步模型的优势丧失殆尽. 如果你是初次接触异步编程,那么你得到的知识看起来有一些局限.你可以在Twisted框架内使用这些新技术,而不是在更广阔的一般Python代 码世界中.同时,当用Twisted工作时,你仅仅局限于那些专门为作为Twisted程序一部分所写的

高性能服务器架构

转自大神的:http://www.cnblogs.com/ringofthec/archive/2010/11/14/hehe.html 任何一行都有自己的军规, 我想这篇著名的文章就是游戏服务器程序员的军规. 也许你认为游戏服务器程序员日常并不涉及这样底层的实现, 而只是去完成策划提出的需求, 我觉得也有道理, 毕竟这些是我们的工作, 下面的译文就不太适合你. 但是对于想改进现有系统, 在服务器方面给予更好的技术支持, 那么你在开始工作之前必须了解一些禁忌, 并且给出了一些解决方向上的真知灼见