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, 0);

    gmain->stack_start = (char*) 1;
    gmain->stack_stop = (char*) -1;
    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;}

转载于:https://www.cnblogs.com/haoqingchuan/p/5090215.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值