首页 > 代码库 > [OpenStack] Nova中的线程模型
[OpenStack] Nova中的线程模型
1) greenlet - python中的协程库
1.1) 什么是协程 (Coroutine)
Coroutine Wiki
http://en.wikipedia.org/wiki/Coroutine
- CoRoutine是在Thread基础上的再次切分. 每一个Process可以包含多个Thread, 每个线程包含多个CoRoutine
- 在任何时刻, 同一个Thread内只能有一个CoRoutine在运行.
- 协程并不是真正的并发, 协程只是同一线程内不同代码的切换. 因此同一Thread内的CoRoutine之间如果访问共享数据, 不需要资源保护.
1.2) python中的 Coroutine 实现 - greenlet
greentlet 是python的Coroutine实现包. 用法可以参考官方的例子from greenlet import greenlet def test1(): print 12 gr2.switch() print 34 def test2(): print 56 gr1.switch() print 78 gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch()
greenlet.greenlet 类 就是 Coroutine 的python 实现, 不同的 greenlet协程之间, 可以调用switch 函数来做切换.
从这段代码也可以看出来, greenlet只实现了基础的Coroutine协程功能. 如果想在项目中直接使用, 我们还要
- 和epoll集成, 通过对IO的select, 来选择要切换的时机
- 一个通用的自动切换/调度程序
- 更多的线程高级概念: Event, Semaphore, ThreadPool等等
所以我们就需要使用eventlet库
2) eventlet - 基于协程的绿色线程
eventlet 库是python下面的一个多线程 IO框架, eventlet通过对epoll 和 greenlet的封装, 实现了 IO复用, 线程池等等高级概念通过eventlet, 我们就不用直接和greenlet库打交道了.
eventlet中经常使用的几个类
GreenThread: 绿色线程. GreenThread 是 eventlet 类的子类, 所以 GreenThread 就是一个协程 Coroutine
- sleep(): 向调度器发出信号, 从当前的GreenThread 切换到别的GreenThread
- spawn(): 启动一个新的GreenThread
greenpool: 绿色线程池. 包含了1到n个greenthread.
- spawn(): 让greenpool 使用pool中的greenthread来运行客户端提交的任务. 如果pool中没有可用的greenthread, spawn()会一直阻塞等待到有可用的greenthread为止
event: 事件类
- wait(): 让调用event.wait()的greenthread处于阻塞等待状态, 直到别的greenthread调用了event.send()为止
- send(): 发送信号, 让所有在event上阻塞的greenthread 结束等待状态, 继续运行.
semaphore: 信号量
- acquire: 获取semaphore. 同一时刻, 只能有一个greenthread获得semaphore, 在无法获得semaphore时, greenthread会处于阻塞等待状态
- release: 释放已经获得的semaphre
3) Nova Service - 基于GreenThread的业务封装
nova service则是对eventlet包的进一步封装- 每一个service都包含了一个greenthread pool, 把业务代码跑在greenthread上.
- 每一个service 包含了event变量, 来等待所有greenthread全部结束
[OpenStack] Nova中的线程模型
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。