玩转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中的协同并发(二)的更多相关文章

  1. 玩转Openstack之Nova中的协同并发(一)

    玩转Openstack之Nova中的协同并发(一) 前不久参加了个Opnstack的Meetup,其中有一个来自EasyStack的大大就Nova中的协同并发做了一番讲解,有所感触,本想当天就总结一下 ...

  2. 每天5分钟 玩转OpenStack 目录列表

    最近在学习 OpenStack 的相关知识,一直苦于 OpenStack 的体系庞大以及复杂程度,学习没有进度,停滞不前.偶然机会在 51CTO 上发现了一个热点的专题关于 OpenStack 的,题 ...

  3. OpenStack协同并发 eventlet

    今天听easystack一哥们讲nova协同并发,结合自己之前的认识.回顾一下openstack eventlet. OpenStack作为热门的开源云平台,本身代码当然得支持高并发. 首先讲讲pyt ...

  4. 学习 OpenStack 的方法论 - 每天5分钟玩转 OpenStack(150)

    作为 OpenStack 的核心教程,我们已经到了最后总结的部分. OpenStack 目前已经有好几十个模块,本教程讨论的是最最重要的核心模块:Keystone,Nova,Glance,Cinder ...

  5. Nova中的系统状态分析

    系统状态 作者 孔令贤 Nova提供这么几个资源状态的查询. Service Nova中的service有两类,一类是所谓的control service,一类就是compute service.要想 ...

  6. 掌握 cinder-scheduler 调度逻辑 - 每天5分钟玩转 OpenStack(48)

    上一节我们详细讨论了 cinder-api 和 cinder-volume,今天讨论另一个重要的 Cinder 组件 cinder-scheduler. 创建 Volume 时,cinder-sche ...

  7. 搭建 OpenStack 实验环境 - 每天5分钟玩转 OpenStack(16)

    在学习 OpenStack 各服务之前,让我们先搭建起一个实验环境. 毋庸置疑,一个看得到摸得着而且允许我们随便折腾的 OpenStack 能够提高我们的学习效率. 因为是我们自己学习用的实验环境,C ...

  8. OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

  9. 看 nova-scheduler 如何选择计算节点 - 每天5分钟玩转 OpenStack(27)

    本节重点介绍 nova-scheduler 的调度机制和实现方法:即解决如何选择在哪个计算节点上启动 instance 的问题. 创建 Instance 时,用户会提出资源需求,例如 CPU.内存.磁 ...

随机推荐

  1. sap.ui.require in SAP UI5 and require in nodejs

    UI5 例如我需要在controller的onShowHello里通过MessageToast弹一个消息显示在UI上, 我需要先定义我自己的controller,该controller extend自 ...

  2. 228. Summary Ranges (everyday promlems) broken problems

    Given a sorted integer array without duplicates, return the summary of its ranges. Example 1: Input: ...

  3. Fiddler-1 官网下载及安装

    1 进入Fiddler官网:http://www.telerik.com/fiddler 点击[Free download]:填写一些信息后就可以下载. 2 双击安装包--下一步dinghanhua下 ...

  4. 微信的 rpx

    微信小程序新单位rpx与自适应布局   rpx是微信小程序新推出的一个单位,按官方的定义,rpx可以根据屏幕宽度进行自适应,在rpx出现之前,web页面的自适应布局已经有了多种解决方案,为什么微信还捣 ...

  5. 【转】在程序中设置android:gravity 和 android:layout_Gravity属性

    在进行UI布局的时候,可能经常会用到 android:gravity  和 android:layout_Gravity 这两个属性. 关于这两个属性的区别,网上已经有很多人进行了说明,这边再简单说一 ...

  6. 剑指offer 和为s的两个数字的调试

    这是整个调试, for (int i:s) cout<<i<<endl;这句话是c++11特性下的一种遍历方式 在编译的时候需要加-std=c++11,即g++ 41.cpp ...

  7. .net 开源的网站

    https://www.zhihu.com/question/24408855 https://www.zhihu.com/question/19840134 这两个知乎的答案 介绍部分经典的.net ...

  8. System.TimeDate

    本篇将介绍时间类型. msdn官网:点击查看 时间辅助类:点击查看  方法:计算两个时间的时间差(年月日小时分钟),获取时间戳,时间格式转换,获取时间随机码 定义:表示时间上的一刻,通常以日期和当天的 ...

  9. =>符号的意义

    => 是 Oracle 中调用存储过程的时候, 指定参数名进行调用.一般是, 某些参数有默认值的时候,你需要跳过某些参数来进行调用. 下面是具体的例子. 参数的默认值SQL> CREATE ...

  10. Windows Subsystem for Linux(WSL)安装记录

    什么是WSL Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层.它是由微软与Canoni ...