设为首页 收藏本站
查看: 1435|回复: 0

[经验分享] 玩转Openstack之Nova中的协同并发(二)

[复制链接]

尚未签到

发表于 2015-4-11 15:04:35 | 显示全部楼层 |阅读模式
  玩转Openstack之Nova中的协同并发(二)
  昨天介绍了Python中的并发处理,主要介绍了Eventlet,今天就接着谈谈Openstack中Nova对其的应用。
  eventlet  

    在nova/cmd/__init__.py中,就直接调用了eventlet的方法,代码如下: 



1 from nova import debugger
2
3 if debugger.enabled():
4     eventlet.monkey_patch(os=False, thread=False)
5 else:
6     eventlet.monkey_patch(os=False)
  这里在调试器被启动后,关闭线程,然后启用远程调试器。这个就是eventlet.monkey_patch()的方法。这里仅仅是因为dnspython无法支持IPV6,所以使用eventlet的monkeypatch检测一下环境变量的设置是否符合。
  greenthread
    在虚机迁移过程中如果看过我写的源码分析,相信对于下面的代码不会陌生:




1  greenthread.spawn(self._live_migration, context, instance, dest,
2                           post_method, recover_method, block_migration,
3                           migrate_data)
  这个是热迁移中所使用的所调用的由eventlet所封装而成的绿色线程,调用了spawn(func,*args, kwargs)的函数,创建了一个绿色线程去运行live_migration也就是热迁移的函数,返回值是一个eventlet.greenthread的对象,这个对象可以用来接受live_migration运行的返回值。在绿色线程池未满的情况下,就可以直接执行热迁移的函数。
  greenthread.sleep
     然后Nova中用到的最多的绿色线程的栗子可能就是time.sleep了吧,下面随便找了几个用到的栗子:



1  for cnt in range(max_retry):
2             try:
3                 self.plug_vifs(instance, network_info)
4                 break
5             except processutils.ProcessExecutionError:
6                 if cnt == max_retry - 1:
7                     raise
8                 else:
9                     LOG.warn(_('plug_vifs() failed %(cnt)d. Retry up to '
10                                '%(max_retry)d.'),
11                              {'cnt': cnt,
12                               'max_retry': max_retry},
13                              instance=instance)
14                     greenthread.sleep(1)
    这个是调用plug_vifs的函数中的greenthread.sleep()的函数调用,这个函数多次的发送请求。



1 except exception.InstanceNotFound:
2               
3                 pass
4             greenthread.sleep(0)
5         return disk_over_committed_size
  像这样的栗子还有好多,一般情况下,greenthread.sleep()绿色线程的函数是为了中止当前的线程,用来给其它的线程一个执行的机会。其实说的通俗点就是传说中的孔融让梨了,不过此处的梨就是CPU、内存等等一些资源了,绿色池中的空间了之类的,突然发现程序也是那么的有人情味啊~
  loopingcall
    接下来谈谈用loopingcall实现固定时间间隔运行的函数:


DSC0000.gif DSC0001.gif


1 def _wait_for_reboot():
2             state = self.get_info(instance)['state']
3
4             if state == power_state.RUNNING:
5                 LOG.info(_("Instance rebooted successfully."),
6                          instance=instance)
7                 raise loopingcall.LoopingCallDone()
8
9         timer = loopingcall.FixedIntervalLoopingCall(_wait_for_reboot)
10         timer.start(interval=0.5).wait()
View Code  这个函数是等待虚机重启的函数,每隔0.5s调用一次函数,检查虚机状态,直到虚机重新启动。此函数通过抛出LoopingCallDone来异常退出。
    好了,对于虚机中的协同并发就到此结束了。

    以上。
  
    PS:本博客欢迎转发,但请注明博客地址及作者,因本人水平有限,若有不对之处,欢迎指出,谢谢~
    博客地址:http://www.iyunv.com/voidy/
    博客新址:http://voidy.net
    

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-56039-1-1.html 上篇帖子: openstack之nova-api服务流程分析 下篇帖子: 怎样写 OpenStack Neutron 的 Plugin (一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表