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

玩转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.Instanc 大专栏  玩转Openstack之Nova中的协同并发(二) · voidyeNotFound:

                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来异常退出。

好了,对于虚机中的协同并发就到此结束了。

以上。


版权声明
本人博文若无特别说明,均由voidy-小鱼原创,若要转载,请附上作者以及博文链接
由于本人水平有限,所以难免有错,若发现错误,请在评论区任意吐槽~
博文链接:http://voidy.net/

Related Posts

  • 21 May 2016 ?
    python之os-可移植访问操作系统特定特性
  • 16 Apr 2016 ?
    使用property装饰器达到setter/getter效果
  • 12 Mar 2016 ?
    python的stdout与stdin

原文地址:https://www.cnblogs.com/liuzhongrong/p/12289361.html

时间: 2024-10-11 05:10:55

玩转Openstack之Nova中的协同并发(二) · voidy的相关文章

玩转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 els

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

玩转Openstack之Nova中的协同并发(一) 前不久参加了个Opnstack的Meetup,其中有一个来自EasyStack的大大就Nova中的协同并发做了一番讲解,有所感触,本想当天就总结一下,但是由于前段时间工作上比较忙,加上为了履行诺言每天几更的来写设计模式系列性文章,故而拖到今天才写此次的总结.好吧,其实归根结底还是自己太懒了,趁着闲时在补新番小笼包之类的.废话就此打住,开始正文. Python中协程的介绍 在此之前,先介绍下Python中的并发,在Python中,并发有三种,分别

OpenStack协同并发 eventlet

今天听easystack一哥们讲nova协同并发,结合自己之前的认识.回顾一下openstack eventlet. OpenStack作为热门的开源云平台,本身代码当然得支持高并发. 首先讲讲python的并发,python中的并发有:进程.线程.协程(Coroutines). 进程和线程大家都比较清楚了,那什么是协程,协程介绍如下: 协程和线程比较像,每个协程都有?己的私有stack和局部变量 一个线程内可以有很多个协程 多个线程可以同时运行.但在一个线程内,同一时间只有一个协程在运行,无须

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

作为 OpenStack 的核心教程,我们已经到了最后总结的部分. OpenStack 目前已经有好几十个模块,本教程讨论的是最最重要的核心模块:Keystone,Nova,Glance,Cinder 和 Neutron.请大家看下图: 此图截自 https://www.openstack.org/software/project-navigator/,这是 OpenStack 官方定义的 6 个 Core Service.每个模块都会从三个维度来衡量: ADOPTION - 采用度 MATUR

Openstack针对nova,cinder,glance使用ceph的虚拟机创建机制优化

 今天在开源中国社区看到有如下一个问题: 已经成功把ceph作为cinder和 glance的后端,但是如果作为nova的后端,虚拟机启动速度非常慢,网上查了一下是因为openstack创建虚拟机的时候通过ceph取镜像创建虚拟机再把虚拟机存回ceph的步骤浪费了很多时间,是否有办法不把镜像取到本地,而是直接在ceph的存储池里完成虚拟机的创建呢? 实际上,我当前也是把ceph作为nova,cinder,glance三者的后端,创建虚拟机速度非常慢.查了一下相关和资料,是有新的处理方式,当前

Openstack之Nova分析

前言  Openstack作为一个虚拟机管理平台,核心功能自然是虚拟机的生命周期的管理,而负责虚机管理的模块就是 Nova. 本文就是openstack中Nova模块的分析,所以本文重点是以下三点: 先了解Openstack的整体架构,搞清楚为什么要用这样的架构: 然后再了解架构中的各个组件,组件提供的主要功能与各个组件之间的交互: 了解虚机的启动过程,能在遇到问题时发现问题出在哪个模块中的哪个组件. Nova组件介绍 接下来进行详细介绍,如有错误,欢迎拍砖! 下图为创建虚拟机的一个大概流程图.

创建 Pool & VIP - 每天5分钟玩转 OpenStack(122)

上节完成了 LBaaS 配置,今天我们开始实现如下 LBaaS 环境. 环境描述如下:1. 创建一个 Pool "web servers".2. 两个 pool member "WEB1" 和 "WEB2",均为运行 Ubuntu cloud image 的 instance.3. load balancer VIP 与 floating IP 关联.4. 位于外网的 client 通过 floating IP 外网访问 web server.

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

上一节我们详细讨论了 cinder-api 和 cinder-volume,今天讨论另一个重要的 Cinder 组件 cinder-scheduler. 创建 Volume 时,cinder-scheduler 会基于容量.Volume Type 等条件选择出最合适的存储节点,然后让其创建 Volume. 下面介绍 cinder-scheduler 是如何实现这个调度工作的. 在 /etc/cinder/cinder.conf 中,cinder 通过 scheduler_driver, sche

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

在学习 OpenStack 各服务之前,让我们先搭建起一个实验环境. 毋庸置疑,一个看得到摸得着而且允许我们随便折腾的 OpenStack 能够提高我们的学习效率. 因为是我们自己学习用的实验环境,CloudMan 推荐使用 DevStackhttp://docs.openstack.org/developer/devstack/DevStack 丰富的选项让我们能够灵活地选取和部署想要的 OpenStack 服务,非常适合学习和研究. 部署拓扑 首先我们来设计 OpenStack 的部署拓扑.