eventlet学习笔记
eventlet学习笔记
标签(空格分隔): python eventlet
eventlet是一个用来处理和网络相关的python库函数,且可以通过协程(coroutines)实现并发。在eventlet里,将协程叫做greenthread(绿色线程),所谓并发,即开启多个greenthread,并对这些greenthread进行管理。尤为方便的是,eventlet为了实现“绿色线程”,竟然对python的和网络相关的几个标准库函数进行了改写,并且可以以补丁(patch)的方式导入到程序中,因为python的库函数只支持普通的线程,而不支持协程,eventlet称之为“绿化”。
eventlet主要基于两个库——greenlet(过程化其并发基础,简单封装后即成为GreenTread)和select.epoll(默认网络通信模型)。
1.greenlet
greenlet支持微线程(tasklet),tasklet伪并发运行,同步在信道上交换数据。
greenlet——coroutines(协程)——micro-thread(微线程)(三者意思相近)
在greenlet上可自定义微线程调度顺序,灵活掌控控制流。
(1)greenlet简介
greenlet之间可相互切换,当一个greenlet1切换至greenlet2时,greenlet1挂起,当greenlet2运行一段时候切换回时,greenlet2挂起,greenlet1恢复运行。
每个greenlet创建时拥有一个空的栈,当切换至该greenlet时,它会运行一个特殊函数(该函数也许会调用其它函数),当最终最外层函数执行完成后,greenlet栈再次为空,greenlet死亡。greenlet也可被不可捕捉的异常杀死。
(2)Parents
每一个greenlet有一个父greenlet,相应父greenlet在greenlet被创建时初始化。greenlet死亡后,父greenlet继续执行。
greenlet树形组织,隐含的main greenlet为此树根节点。任何一个greenlet死亡,执行顺序将被回溯至main greenlet。异常发生将传播至parent greenlet。
switch不是调用,只是在并行的'stack containers'中传输执行。
(3)实例化
greenlet类型greenlet.greenlet,有如下一些方法:
greenlet(run=None, parent=None)
创建一个新的greenlet对象但并不运行,run为可调用请求,parent为父greenlet,默认为当前greenlet。
greenlet.getcurrent()
返回当前greenlet。
greenlet.GreenletExit
此特殊异常不会传播至父greenlet,它被用于杀死一个单独的greenlet。
(4)切换
greenlet切换发生在switch()函数被调用或一个greenlet死亡时。调用switch
()函数的greenlet为切换至的目标greenlet;greenlet死亡时切换至parent greenlet。切换时,一个对象或异常发送至目标greenlet,这即是greenlets间方便的通信方式。例如:
def test1(x, y):
z = gr2.switch(x+y)
print z
def test2(u):
print u
gr1.switch(42)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch("hello", " world")
此段程序输出“hello world”和42.需注意test1()和test2()的参数并不是在greenlet创建时给出,而是在第一次切换到相应greenlet时给出。
g.switch(*args, **kwargs)
切换至greenlet g执行。
需要注意的是x = g.switch(y),会将对象y发送给g,然而稍后却有可能将毫无关联的对象经毫无关联的greenlet处理后返回给x。这可以理解为g.switch(y)的值没有立即返回,而其它greenlet的结果却先返回了!!!
switch至一个已经死亡的greenlet,最终将会switch至其parent greenlet或parent' parent greenlet,如此回溯。(最终的parent greenlet是main greenlet,永不死亡。)
(5)greenlets方法和属性
g.switch(*args, **kwargs)
切换至greenlet g执行。
g.run
执行后运行greenlet g,g运行后该属性不再存在。
g.parent
g的parent greenlet。该变量可写,但禁止构造循环型父子关系。
g.gr_frame
目前上层框架,或为None。
g.dead
当g死亡时值为True。
bool(g)
g处于活动状态时值为True,若死亡或还未开始值为False。
g.throw([typ, [val, [tb]]])
切换执行序列至greenlet g,在g中立即抛出给定异常。若未提供参数,异常默认为greenlet.GreenletExit。
(6)Greenlet和python线程
Greenlet能够和Python线程结合,每个python线程中包含一个独立的main greenlet及由其子greenlet构成的树。但不属于同一个线程的不同greenlet之间不能结合或切换。
参考文章:
【1】Eventlet documentation
【2】Openstack eventlet分析——溜溜小哥的CSDN博客
eventlet学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- String Successor(模拟)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3490 题意:给出一个字符串,一个操作次数,每次操作从当前字符串最右边的字符 ...
- codevs1036商务旅行(LCA)
1036 商务旅行 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 某首都城市的商人要经常到各城镇去做 ...
- Akka源码分析-Remote-Creating Actors Remotely
在akka官网中关于远程actor交互,介绍了两种方法,一种是通过actorSelection查询,另一种是通过actorOf在远程节点创建一个actor.actorSelection我们之前的博客中 ...
- 【转】关于Java基础你不得不会的34个问题
1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的 ...
- 修路方案 Kruskal 之 次小生成树
次小生成树 : Kruskal 是先求出来 最小生成树 , 并且记录下来所用到的的边 , 然后再求每次都 去掉最小生成树中的一个边 , 这样求最小生成树 , 然后看能不能得到 和原来最小生成树一样的 ...
- 发布 Windows 服务
1. 如何新建 Windows 服务 打开VS,“新建项目”-->“windows 桌面”-->“windows 服务”: http://www.cnblogs.com/sorex/arc ...
- JavaScript入门三
*********BOM和DOM******** JavaScript分为 ECMAScript,DOM,BOM. BOM(Browser Object Model)是指浏览器对象模型,它使 Java ...
- vue 中展示PDF内容
vue 中展示PDF内容 不久前有个需要改的需求,以前是直接根据链接让用户下载对应pdf文件来查看,最主要是给用户查看,然而这种并不是很安全的,其他用户可以进行下载或者使用pdf链接分享给其他人,所以 ...
- [ SCOI 2009 ] 最长距离
\(\\\) \(Description\) 一个\(N\times M\)的网格图中有一些坏点,图是四联通的. 你至多可以拿走\(K\)个坏点,求拿走后联通的点对中欧几里得距离最大是多少. \(N, ...
- iOS 从xib中加载自定义视图
想当初在学校主攻的是.NET,来到公司后,立马变成java开发,之后又跳到iOS开发,IT人这样真的好么~~ 天有不测风云,云还有变幻莫测哎,废话Over,let's go~ 新学iOS开发不久,一 ...