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中创建接消息的进程直接创建绿色线程
eventlet.spawn()
那么在绿色线程到底都走了哪些流程呢?
在使用greenlet来创建新的对象的时候,会用调用green_new(tp_new)来创建,后序使用green_init(__init__)来做初始化。在用green_new创建对象时,将此greenlet对象的parent设置为当前的greenlet。
static PyObject* green_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject* o = PyBaseObject_Type.tp_new(type, ts_empty_tuple, ts_empty_dict);
if (o != NULL) {
if (!STATE_OK) {
Py_DECREF(o);
return NULL;
}
Py_INCREF(ts_current);
((PyGreenlet*) o)->parent = ts_current;
}
return o;
}
在初始化时将设置了运行函数信息,self->run_info = nrun。
在引用greenlet库时,会引用main greenlet,这个是对用户透明的库,所以在使用greenlet库时,除了显式创建的greenlet运行结束之后,还有会运行main greenlet继续执行。
在引用模块的时候会调用initModuleName函数来做初始化,对于greenlet库有对应的initgreenlet函数,其中调用了green_create_main来创建main greenlet
static PyGreenlet* green_create_main(void)
{
PyGreenlet* gmain;
PyObject* dict = PyThreadState_GetDict();
/* create the main greenlet for this thread */
gmain = (PyGreenlet*) PyType_GenericAlloc(&PyGreenlet_Type, ); gmain->stack_start = (char*) ;
gmain->stack_stop = (char*) -;
gmain->run_info = dict;
Py_INCREF(dict);
return gmain;
}
在调用 gr.switch的时候会做如下三个动作来完成切换。
- 保存线程状态,即EIP
- 进行C栈切换,汇编实现
- 恢复目标线程状态,即跳转执行位置
static PyObject* green_new(PyTypeObject *type, PyObject *args, PyObject *kwds){PyObject* o = PyBaseObject_Type.tp_new(type, ts_empty_tuple, ts_empty_dict);if (o != NULL) {if (!STATE_OK) {Py_DECREF(o);return NULL;}Py_INCREF(ts_current);((PyGreenlet*) o)->parent = ts_current;}return o;}
openstack中eventlet使用的更多相关文章
- OpenStack中给wsgi程序写单元測试的方法
在 OpenStack 中, 针对web应用, 有三种方法来写单元測试 1) 使用webob生成模拟的request from __future__ import print_function imp ...
- OpenStack中Keystone的基本概念理解
原文http://www.kankanews.com/ICkengine/archives/10788.shtml Keystone简介 Keystone(OpenStack Identity Ser ...
- 探索 OpenStack 之(14):OpenStack 中 RabbitMQ 的使用
本文是 OpenStack 中的 RabbitMQ 使用研究 两部分中的第一部分,将介绍 RabbitMQ 的基本概念,即 RabbitMQ 是什么.第二部分将介绍其在 OpenStack 中的使用. ...
- openstack中彻底删除计算节点的操作记录
在使用openstack的过程中,我们经常会添加好几台计算节点来部署虚拟机,在后续使用中由于某些原因,一些计算节点出现了问题,需要将这些出了问题的计算节点从openstack的控制节点中踢出去!但是很 ...
- openstack中iptables的使用
openstack中nova使用了iptables实现其网络相关功能,乍看openstack的iptables表比较复杂,整理了一下iptables的filter表和nat表的结构,以一个all in ...
- OpenStack中memcached的使用和实现
概述 主要分享下个人对Liberty版本openstack中cache使用的理解,由于作者水平有限,难免有所错误,疏漏,还望批评指正. openstack中可以使用cache层来缓存数据,Libert ...
- openstack中的环境准备
openstack中环境准备基于Ubuntu系统 author:headsen chen 2017-10-13 11:51:50 个人原创,转载请注明作者,出处. 6 apt-get insta ...
- OpenStack中部署glance的步骤
OpenStack中部署glance的步骤(基于Ubuntu14.04系统) author:headsen chen 2017-10-13 08:34:35 个人原创,转载请注明作者,出处, ...
- OpenStack中的rabbitmq的配置方法
OpenStack中的rabbitmq的配置方法 author:headsen chen 2017-10-11 17:24:58 个人原创,允许转载,转载请注明作者,出处,否则依法追究法律责任 ...
随机推荐
- MySQL分库分表总结
单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 随着用户数量的增加,user表的数据量会越来越大,当数 ...
- poj1988_Cube Stacking
Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 24130 Accepted: 8468 Ca ...
- SQL的ROW_NUMBER函数
with tabs as ( select ROW_NUMBER() over(partition by customerID order by totalPrice) as rows,custome ...
- js指定分隔符连接数组元素join()
指定分隔符连接数组元素join() join()方法用于把数组中的所有元素放入一个字符串.元素是通过指定的分隔符进行分隔的. 语法: arrayObject.join(分隔符) 参数说明: 注意:返回 ...
- jquery this 和 event.target 区别
1.this和event.target的区别: js中事件是会冒泡的,所以this是可以变化的,但event.target不会变化,它永远是直接接受事件的目标DOM元素: 2.this和event.t ...
- NYOJ题目20吝啬的国度
-----------------------------------------n-1条边的无向连通图是一棵树,又因为树上两点之间的路径是唯一的,所以解是唯一的.(注意并不一定是二叉树,所以最好采用 ...
- [MongoDB]安装MongoDB
汇总: 1. [MongoDB]安装MongoDB2. [MongoDB]Mongo基本使用:3. [MongoDB]MongoDB的优缺点及与关系型数据库的比较4. [MongoDB]MongoDB ...
- JS控制按钮不能连续被点击
将下面代码拷贝进一个html文件中就可以运行查看效果. function downLoad(evt) { disabledButton(); MyPeriodicalExecuter(evt); } ...
- 疑问:line-height对非文字行内块的影响
line-height:对子元素是非文字的行内块,表现出来的不是垂直居中.目前还不知道具体细节. 可以看出来两个东西不在一行.老师的解释是line-height对非文字元素解释不一样,但是我没懂细节. ...
- UIView--震动效果
//震动效果- (void)shake:(UIView *)view{ CGRect frame = view.frame; CAKeyframeAnimation *shakeAnimation = ...