玩转Openstack之Nova中的协同并发(二)
玩转Openstack之Nova中的协同并发(二)
昨天介绍了Python中的并发处理,主要介绍了Eventlet,今天就接着谈谈Openstack中Nova对其的应用。
eventlet
在nova/cmd/__init__.py中,就直接调用了eventlet的方法,代码如下:
from nova import debugger if debugger.enabled():
eventlet.monkey_patch(os=False, thread=False)
else:
eventlet.monkey_patch(os=False)
这里在调试器被启动后,关闭线程,然后启用远程调试器。这个就是eventlet.monkey_patch()的方法。这里仅仅是因为dnspython无法支持IPV6,所以使用eventlet的monkeypatch检测一下环境变量的设置是否符合。
greenthread
在虚机迁移过程中如果看过我写的源码分析,相信对于下面的代码不会陌生:
greenthread.spawn(self._live_migration, context, instance, dest,
post_method, recover_method, block_migration,
migrate_data)
这个是热迁移中所使用的所调用的由eventlet所封装而成的绿色线程,调用了spawn(func,*args, kwargs)的函数,创建了一个绿色线程去运行live_migration也就是热迁移的函数,返回值是一个eventlet.greenthread的对象,这个对象可以用来接受live_migration运行的返回值。在绿色线程池未满的情况下,就可以直接执行热迁移的函数。
greenthread.sleep
然后Nova中用到的最多的绿色线程的栗子可能就是time.sleep了吧,下面随便找了几个用到的栗子:
for cnt in range(max_retry):
try:
self.plug_vifs(instance, network_info)
break
except processutils.ProcessExecutionError:
if cnt == max_retry - 1:
raise
else:
LOG.warn(_('plug_vifs() failed %(cnt)d. Retry up to '
'%(max_retry)d.'),
{'cnt': cnt,
'max_retry': max_retry},
instance=instance)
greenthread.sleep(1)
这个是调用plug_vifs的函数中的greenthread.sleep()的函数调用,这个函数多次的发送请求。
except exception.InstanceNotFound:
pass
greenthread.sleep(0)
return disk_over_committed_size
像这样的栗子还有好多,一般情况下,greenthread.sleep()绿色线程的函数是为了中止当前的线程,用来给其它的线程一个执行的机会。其实说的通俗点就是传说中的孔融让梨了,不过此处的梨就是CPU、内存等等一些资源了,绿色池中的空间了之类的,突然发现程序也是那么的有人情味啊~
loopingcall
接下来谈谈用loopingcall实现固定时间间隔运行的函数:
def _wait_for_reboot():
state = self.get_info(instance)['state'] if state == power_state.RUNNING:
LOG.info(_("Instance rebooted successfully."),
instance=instance)
raise loopingcall.LoopingCallDone() timer = loopingcall.FixedIntervalLoopingCall(_wait_for_reboot)
timer.start(interval=0.5).wait()
这个函数是等待虚机重启的函数,每隔0.5s调用一次函数,检查虚机状态,直到虚机重新启动。此函数通过抛出LoopingCallDone来异常退出。
好了,对于虚机中的协同并发就到此结束了。
以上。
PS:本博客欢迎转发,但请注明博客地址及作者,因本人水平有限,若有不对之处,欢迎指出,谢谢~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
玩转Openstack之Nova中的协同并发(二)的更多相关文章
- 玩转Openstack之Nova中的协同并发(一)
玩转Openstack之Nova中的协同并发(一) 前不久参加了个Opnstack的Meetup,其中有一个来自EasyStack的大大就Nova中的协同并发做了一番讲解,有所感触,本想当天就总结一下 ...
- 每天5分钟 玩转OpenStack 目录列表
最近在学习 OpenStack 的相关知识,一直苦于 OpenStack 的体系庞大以及复杂程度,学习没有进度,停滞不前.偶然机会在 51CTO 上发现了一个热点的专题关于 OpenStack 的,题 ...
- OpenStack协同并发 eventlet
今天听easystack一哥们讲nova协同并发,结合自己之前的认识.回顾一下openstack eventlet. OpenStack作为热门的开源云平台,本身代码当然得支持高并发. 首先讲讲pyt ...
- 学习 OpenStack 的方法论 - 每天5分钟玩转 OpenStack(150)
作为 OpenStack 的核心教程,我们已经到了最后总结的部分. OpenStack 目前已经有好几十个模块,本教程讨论的是最最重要的核心模块:Keystone,Nova,Glance,Cinder ...
- Nova中的系统状态分析
系统状态 作者 孔令贤 Nova提供这么几个资源状态的查询. Service Nova中的service有两类,一类是所谓的control service,一类就是compute service.要想 ...
- 掌握 cinder-scheduler 调度逻辑 - 每天5分钟玩转 OpenStack(48)
上一节我们详细讨论了 cinder-api 和 cinder-volume,今天讨论另一个重要的 Cinder 组件 cinder-scheduler. 创建 Volume 时,cinder-sche ...
- 搭建 OpenStack 实验环境 - 每天5分钟玩转 OpenStack(16)
在学习 OpenStack 各服务之前,让我们先搭建起一个实验环境. 毋庸置疑,一个看得到摸得着而且允许我们随便折腾的 OpenStack 能够提高我们的学习效率. 因为是我们自己学习用的实验环境,C ...
- OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)
API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...
- 看 nova-scheduler 如何选择计算节点 - 每天5分钟玩转 OpenStack(27)
本节重点介绍 nova-scheduler 的调度机制和实现方法:即解决如何选择在哪个计算节点上启动 instance 的问题. 创建 Instance 时,用户会提出资源需求,例如 CPU.内存.磁 ...
随机推荐
- Poj(1521),哈夫曼编码
题目链接:http://poj.org/problem?id=1521 这里,网上有很多博客都有写,很多人没有建树,直接就是求一下这个哈夫曼编码的长度,的确很巧妙,我也用的这个方法,但是,几乎所有博客 ...
- Node.js 的初体验
例子1: 1.首先第一步 :要 下载 node.js. 官网 上可以下载 下载完后,是这个玩意. 2. 打开 node.js ,然后输入 // 引入http模块 var http = require( ...
- Java 类加载体系之 ClassLoader 双亲委托机制
Java 类加载体系之 ClassLoader 双亲委托机制 java 是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件 ...
- sql查询字段值长度判断是否18位
SELECT * FROM 表名 WHERE LENGTH(字段)= OR 字段为null IS NULL OR 字段为空='' SELECT * FROM 表名 WHERE LENGTH(字段)&g ...
- 前端面试整理(HTML&CSS)
1.行内元素和块级元素?img算什么?行内元素怎么转化为块级元素? 行内元素:和有他元素都在一行上,高度.行高及外边距和内边距都不可改变,文字图片的宽度不可改变,只能容纳文本或者其他行内元素:其中im ...
- 什么是 BIND 变量?
变量绑定会使联机事务处理过程(OLTP)系统数据库中的SQL执行速度飞快,内存效率极高:不使用绑定变量可能会使OLTP数据库不堪重负,资源被SQL解析严重耗尽,系统运行缓慢. 当一个用户与数据库建立连 ...
- Lucene检索提高性能的几个方式
1.采用最新版本的Lucene 2.索引文件存储采用本地文件系统,如果需要挂载远程系统,请采用 readonly方式. 3.当然采用更好的硬件,更高I/O的磁盘 4.提高OS 缓存,调整参数 5.提高 ...
- angular学习之angular-phonecat项目的实现
---恢复内容开始--- AngularJS官方网站提供了一个用于学习的示例项目:PhoneCat.这是一个Web应用,用户可以浏览一些Android手机,了解它们的详细信息,并进行搜索和排序操作. ...
- P2661 信息传递 DFS
题目链接:洛谷 P2661 信息传递 一个人要想知道自己的生日,就意味着信息的传递是成环的,因为每轮信息只能传递一个人,传递的轮数就等于环的大小 环的大小就等于环中的两个点到第三个点的距离之和加一,我 ...
- motto - question - bodyParser.urlencoded 中设置 extended 为 true 和 false 有什么区别吗?
本文搜索关键字:motto node nodejs js javascript body-parser bodyparser urlencoded x-www-form-urlencoded exte ...