【翻译】nova线程模型

注:整个openstack中使用的线程池是greenlet,WSGI通过eventlet,这个之前分析Swift有提到过,这篇翻译,翻译的不好,但是主要提到了nova中涉及线程的重点,可以带着这些去阅读源码。

翻译自http://docs.openstack.org/developer/nova/devref/threading.html 

    线程模型

    所有的Openstack服务使用绿色线程模型处理线程,通过使用Python eventlet 和 greenlet库来实现。

    绿色线程使用协作模型来处理线程:线程上下文的切换只能发生在当特殊的eventlet 或者 greenlet 库调用(例如 sleep,I/O调用)。从操作系统的角度来看。每一个OpenStack 服务 运行一个单独的线程。

    通过使用绿色线程减少了竞争条件的可能性,但是没有完全的消除它们。在有些情况下,你或许需要使用@lockutils.synchronized(...)装饰器来避免竞争。

    另外,由于只有一个操作系统线程,一个调用的阻塞,主线程将会阻塞所有的进程。

    Yielding 线程在 长时间运行的任务

    如果一段代码的需要长时间的执行,但是没有包含任何可以触发eventlet上下文切换的方法,长时间运行的线程将会阻塞任何挂起的线程。

    这个场景可以通过添加调用在eventlet睡眠方法在长时间运行的代码上来避免。这个睡眠调用将触发一个上下文切换,如果有挂起的线程的话。使用一个参数为0将避免引入延时,在这种情况下这只有一个单独的绿色线程:

from eventlet import greenthread
...
greenthread.sleep(0)

MySQL 访问和 eventlet

    在MySQL数据库中查询将会阻塞一个服务的主线程、这是因为OpenStack服务使用一个外部的C库来访问MySQL数据库,因为eventlet不能使用内置扩展来拦截阻塞调用在一个 C库,由此产生了数据查询阻塞这个线程。

    D版本的发布包含了一个线程池实现了无阻塞,但是这个实现导致了一个bug然后被删除了。


转载于:https://my.oschina.net/zhouxingxing/blog/89027

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值