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使用的更多相关文章

  1. OpenStack中给wsgi程序写单元測试的方法

    在 OpenStack 中, 针对web应用, 有三种方法来写单元測试 1) 使用webob生成模拟的request from __future__ import print_function imp ...

  2. OpenStack中Keystone的基本概念理解

    原文http://www.kankanews.com/ICkengine/archives/10788.shtml Keystone简介 Keystone(OpenStack Identity Ser ...

  3. 探索 OpenStack 之(14):OpenStack 中 RabbitMQ 的使用

    本文是 OpenStack 中的 RabbitMQ 使用研究 两部分中的第一部分,将介绍 RabbitMQ 的基本概念,即 RabbitMQ 是什么.第二部分将介绍其在 OpenStack 中的使用. ...

  4. openstack中彻底删除计算节点的操作记录

    在使用openstack的过程中,我们经常会添加好几台计算节点来部署虚拟机,在后续使用中由于某些原因,一些计算节点出现了问题,需要将这些出了问题的计算节点从openstack的控制节点中踢出去!但是很 ...

  5. openstack中iptables的使用

    openstack中nova使用了iptables实现其网络相关功能,乍看openstack的iptables表比较复杂,整理了一下iptables的filter表和nat表的结构,以一个all in ...

  6. OpenStack中memcached的使用和实现

    概述 主要分享下个人对Liberty版本openstack中cache使用的理解,由于作者水平有限,难免有所错误,疏漏,还望批评指正. openstack中可以使用cache层来缓存数据,Libert ...

  7. openstack中的环境准备

    openstack中环境准备基于Ubuntu系统 author:headsen chen   2017-10-13  11:51:50 个人原创,转载请注明作者,出处. 6 apt-get insta ...

  8. OpenStack中部署glance的步骤

    OpenStack中部署glance的步骤(基于Ubuntu14.04系统) author:headsen  chen   2017-10-13   08:34:35 个人原创,转载请注明作者,出处, ...

  9. OpenStack中的rabbitmq的配置方法

    OpenStack中的rabbitmq的配置方法 author:headsen chen   2017-10-11  17:24:58 个人原创,允许转载,转载请注明作者,出处,否则依法追究法律责任 ...

随机推荐

  1. Json---使用Jsoncpp解析与写入

    上述Json解析使用的是Jsoncpp,要使用Jsoncpp,得做如下几步的配置: 1.首先从http://sourceforge.net/projects/jsoncpp/下载,压缩包大约105k. ...

  2. 关于网络-get/post

    关于网络: //英译  connection:连接 append:添加 resign:放弃 // 加载网页数据 步骤 [self.webView loadRequest:request]; NSURL ...

  3. centos下查看最大Socket连接数

    使用命令ulimit -a查看,其中open files就是最大连接数,一般情况下web服务器最大连接数的设置不能超过它 修改最大连接数:vi /etc/security/limits.conf 文件 ...

  4. Ubuntu下Sublime Text 3解决无法输入中文的方法

    Ubuntu下Sublime Text 3解决无法输入中文的方法_百度经验http://jingyan.baidu.com/article/f3ad7d0ff8731609c3345b3b.html ...

  5. python环境变量自动配置脚本(setx使用)

    前言 setx不是windows系统自带的工具,需要到微软官网下载,但是有的系统也会自带.(是官方提供的,可放心食用) set和setx都可以用来配置环境变量.他们的不同点在于,set只是临时的修改环 ...

  6. 对DIP IoC DI的理解与运用

    DIP,IoC,DI基本概念 依赖倒置原则(DIP,Dependency Inverse Principle):强调系统的“高层组件”不应当依赖于“底层组件”,并且不论是“高层组件”还是“底层组件”都 ...

  7. html学习第一天笔记——第四、五章节

    讲解:1. 在上面的例子中,“庄生晓梦迷蝴蝶.望帝春心托杜鹃.” 这是一句诗歌,出自晚唐诗人李商隐的<锦瑟> .因为不是作者自己的文字,所以需要使用<q></q>实 ...

  8. [自动运维]oracle自动备份

    数据是应用的核心部分,程序坏了换台机器重新发布就可以,但数据一旦丢失,造成的损失将不可挽回,程序发布到生产后,数据的备份便显得尤为重要,由于不一定所有的服务均有资金完成高级的备份如RAC和DG,在我们 ...

  9. <!DOCTYPE html PUBLIC 导致js代码不可用

    在有了这个 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  10. Shader实例:一台旧电视

    准备: 1.一段小视频 2.一张电视机贴图 3.一张过滤图 效果: 让视频内容只在电视机屏幕区域显示 Shader代码:有注释 Shader "Joe/old_tv" { Prop ...