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学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. ubuntu 16.04 Hbase 安装

    1.解压安装包至路径 /usr/local 1.1.sudo tar -zxf ~/下载/hbase-1.1.2-bin.tar.gz -C /usr/local 2.将解压的文件名hbase-1.1 ...

  2. 42.extjs Combobox动态加载数据问题,mode:local 还是remote

    问题: Java代码   var fabircTypeDs = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ url: 'province. ...

  3. E20170629-hm

    enqueue  [计] 入队,排队; dequeue  [计]  出列; rear  n. 后部,背面,背后; 臀部; (舰队或军队的) 后方,后尾,殿后部队; 〈英口〉厕所; ring buffe ...

  4. esp和ebp指针

    gdb调试的时候会出现esp和ebp这两个指针,而这两个指针为我们查看栈的情况提供了方便. 简单点说,esp指向栈顶,而ebp指向栈底.例如一段程序: #include <stdio.h> ...

  5. 如何使jquery性能最佳

    转自 http://www.cnblogs.com/mo-beifeng/archive/2012/02/02/2336228.html 1. 使用最新版本的jQuery jQuery的版本更新很快, ...

  6. [Swift通天遁地]四、网络和线程-(15)程序内购功能

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  7. jQueryTools-Scrollable.js

    转载一篇例子,学习使用: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...

  8. Github提交本地版本是遇到的问题

    问题如下:*** Please tell me who you are. Run git config --global user.email "you@example.com" ...

  9. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'empid' in 'class cn.happy.entity.Emp'

    org.apache.ibatis.exceptions.PersistenceException: ### Error querying database.  Cause: org.apache.i ...

  10. CSS——font

    行高的量取方式: 1.第一行可设置margin-top值.然后将第一文字顶部到第二行文字顶部的值作为行高的值(要注意对齐方式) 2.将 3.电视上 font:12px/1.5//字体12px,行高1. ...