玩转Openstack之Nova中的协同并发.docxVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
玩转Openstack之Nova中的协同并发

玩转Openstack之Nova中的协同并发 前不久参加了个Opnstack的Meetup,其中有一个来自EasyStack的大大就Nova中的协同并发做了一番讲解,有所感触,本想当天就总结一下,但是由于前段时间工作上比较忙,加上为了履行诺言每天几更的来写设计模式系列性文章,故而拖到今天才写此次的总结。好吧,其实归根结底还是自己太懒了,趁着闲时在补新番小笼包之类的。废话就此打住,开始正文。 Python中协程的介绍 在此之前,先介绍下Python中的并发,在Python中,并发有三种,分别是: 进程:Python中一般使用multiprocessing/subprocess来实现 线程:threading/thread是Python中用来实现多线程的模块 协程(Coroutines):Python中用于处理协程的模块倒是比较多,有eventlet、Twisted、Tulip、asyncio 有关进程、协程、线程中的关系图如下所示(图来自EasyStack的大大): 想必大家对进程以及线程那是相当的熟悉了,所以就重点介绍下协程:协程源自 Simula 和 Modula-2 语言,但也有其他语言支持。协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务,迭代器,无限列表和管道。 协程最初在1963年被提出。那么协程又有什么特点呢? 每个协程都有自己的私有stack以及局部变量。 线程我们都知道可以多个同时运行,也就是所谓的多线程,但是同一时间只有一个协程在运行,所以就无须对某些共享变量加锁。 由于协程比较轻量级,所以一个线程中可以有多个协程。 协程之间的执行顺序,完全由程序来控制。 其实协程也就仅仅是一种概念罢了,非操作系统可见,在多种语言中都有实现,一会详细介绍的eventlet就是在Python中实现的一种。 Eventlet的介绍 eventlet其实就是对greenlet的一个封装,对其进行简单的封装之后,就成了所谓的greenthread,greenlet是一个称为协程(coroutine)的东西。下面上一个greenlet的例子来介绍一下greenlet: 1from?greenletimportgreenlet23def?test1:4print?125gr2.switch6print?3478def?test2:9print?5610gr1.switch11print?781213gr1?=greenlet(test1)14gr2?=greenlet(test2)15gr1.switch? 执行结果是: 也就是说在这里先定义了两个函数test1,test2以及两个协程gr1,gr2,最后一行g1.switch跳转到 test1 ,它打印12,然后执行gr2.switch,跳转到 test2 ,打印56,然后又执行了gr1.switch跳转回 test1 ,打印34,然后 test1 就结束,gr1死掉,回到父greenlet,不会再切换到test2,所以不会打印78。在上面的例子中main greenlet就是它们的父 greenlet。 eventlet是一个用来处理和网络相关的python库函数,而且可以通过协程来实现并发,在eventlet里,把“协程”叫做greenthread(绿色线程)。所谓并发,就是开启了多个greenthread,并且对这些greenthread进行管理,以实现非阻塞式的I/O。比如说用eventlet可以很方便的写一个性能很好的web服务器,或者是一个效率很高的网页爬虫,这都归功于eventlet的“绿色线程”,以及对“绿色线程”的管理机制。更让人不可思议的是,eventlet为了实现“绿色线程”,竟然对python的和网络相关的几个标准库函数进行了改写,并且可以以补丁(patch)的方式导入到程序中,因为python的库函数只支持普通的线程,而不支持协程,eventlet称之为“绿化”。Eventlet库在OpenStack服务中上镜率很高,尤其是在服务的多线程和WSGI Server并发处理请求的情况下。 主要API如下: Greenthread 产?: spawn(func, *args, **kwargs): 创建一个绿色线程去运行func这个函数,后面的参数是传递给这个函数的参数。返回值是一个eventlet.GreenThread对象,这个对象可以用来接受func函数运行的返回值。在绿色线程池还没有满的情况下,这个绿色线程一被创建就立刻被执行。其实,用这种方法去创建线程也是可以理解的,线程被创建出来,肯定是有一定的任务要去执行,这里直接把函数当作参数传递进去,去执行一定的任务,就好像标准库中的线程用run方法去执行任务一样。 spawn_n(func, *args,

文档评论(0)

didala + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档