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. 洛谷P1193 洛谷团队训练VS传统团队训练

    题目背景 "在中学的信息学教育领域,洛谷无疑是一个相当受欢迎的辅助网站.同时有百余所学校正在通过洛谷进行信息学竞赛(以后简称OI)的教育.洛谷之所以如此受欢迎,是因为洛谷创新的将OI教育的几 ...

  2. Gift

    [问题描述] 人生赢家老王在网上认识了一个妹纸,然后妹纸的生日到了,为了表示自己的心 意,他决定送她礼物.可是她喜爱的东西特别多,然而他的钱数有限,因此他想 知道当他花一定钱数后剩余钱数无法再购买任何 ...

  3. E20170621-hm

    detroit  底特律 giant   n. 巨人,大汉; 巨兽,巨物; 卓越人物 woo    vt. 求爱,求婚; 争取…的支持; convince   vt. 使相信,说服,使承认; 使明白; ...

  4. codevs3162抄书问题(划分型dp)

    3162 抄书问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每 ...

  5. Tornado异步模式

    先介绍下背景:由于工作需要,前段时间又写了一段爬虫去获取和更新一些数据.之前爬虫主要用Scrapy框架批量爬取一些页面数据,或者用Gevent调用目标站点的接口.偶然看到了Tornado,听说这个框架 ...

  6. Educational Codeforces Round 45

    A. 一个小模拟    不解释 //By SiriusRen #include <bits/stdc++.h> using namespace std; long long n,m,a,b ...

  7. [转]mysql的约束

    转自:http://blog.csdn.net/kqygww/article/details/8882990 MySQL中约束保存在information_schema数据库的table_constr ...

  8. V3的普通窗体控件的使用

    1.文本: 属性: 标签对齐方式: Left  Right  Center 值对齐方式: Left  Right  Center 事件: 值改变事件 值加载事件 单击标题事件 键盘按下事件 获得焦点事 ...

  9. Caffe FCN:可视化featureMaps和Weights(C++)、获取FCN结果

    为何不使用C++版本FCN获取最后的分割掩模,何必要使用python呢!因此需要获取网络最后层的featureMaps,featureMaps的结果直接对应了segmentation的最终结果,可以直 ...

  10. tab切换案例

    做个简单的tab切换效果,分别于jquery和js操作 (1)jQuery操作 先看下效果: <!DOCTYPE html> <html lang="en"> ...