OpenStack服务使用绿色线程模型,通过Python的eventlet和greenlet库实现。

绿色线程使用线程的协作模型:线程上下文环境的切换仅仅发生在当特定的eventlet或greenlet库函数调用的时候。从操作系统的视角来看,每一个Openstack服务运行在一个线程中。(绿色线程对操作系统不可见)

绿色线程的使用减少了条件竞争的可能性,但并没有完全消除竞争。在某些情况下,你可能要使用@lockutils.synchronized(...)包装函数来避免竞争。

补充一点:因为仅有一个操作系统线程(区别于绿色线程),一个阻塞主线程(绿色线程中的主线程)的调用将阻塞整个进程。

在长时间运行的任务中生成线程
如果代码需要很长时间去运行,并且没有包含任何能够引起线程上下文切换的方法,这个长时间运行的线程将阻塞任何挂起的线程。

在长时间运行的线程中,调用eventlet库中的sleep方法能够避免上述场景的发生。如果存在挂起的线程,sleep调用将触发线程上下文切换,传递参数0能够避免在仅有一个绿色线程情况下的延迟。

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

MySQL访问和eventlet

查询MySQL数据库将阻塞服务的主线程。这是因为Openstack服务使用另外的C库来访问MySQL。eventlet不能使用monkey-patching拦截C库中的调用,导致数据库查询阻塞线程。

 

 

posted on 2014-05-06 11:20  cfs111  阅读(213)  评论(0编辑  收藏  举报