• 玩转Openstack之Nova中的协同并发(二)


    玩转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实现固定时间间隔运行的函数:

     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.cnblogs.com/voidy/

      博客新址:http://voidy.net

      <。)#)))≦

  • 相关阅读:
    Python基础-16生成器-迭代器
    Python基础-15模块-包-库
    Python基础-14异常处理
    Python基础-13面向对象
    Python基础-12解析式
    Python 入门日记(十)—— 文件和异常
    Python 入门日记(九)—— 类
    Python 入门日记(八)—— 函数
    Python 入门日记(七)—— 用户输入和 while 循环
    Python 入门日记(六)—— 字典
  • 原文地址:https://www.cnblogs.com/voidy/p/4276141.html
Copyright © 2020-2023  润新知