【翻译】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然后被删除了。


你可能感兴趣的:(openstack,nova)