Eventlet学习总结汇编.docx

上传人:b****3 文档编号:859722 上传时间:2022-10-13 格式:DOCX 页数:8 大小:32.95KB
下载 相关 举报
Eventlet学习总结汇编.docx_第1页
第1页 / 共8页
Eventlet学习总结汇编.docx_第2页
第2页 / 共8页
Eventlet学习总结汇编.docx_第3页
第3页 / 共8页
Eventlet学习总结汇编.docx_第4页
第4页 / 共8页
Eventlet学习总结汇编.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

Eventlet学习总结汇编.docx

《Eventlet学习总结汇编.docx》由会员分享,可在线阅读,更多相关《Eventlet学习总结汇编.docx(8页珍藏版)》请在冰豆网上搜索。

Eventlet学习总结汇编.docx

Eventlet学习总结汇编

Eventlet定义:

eventlet是一个用来处理和网络相关的python网络库,而且可以通过协程来实现并发,在eventlet里,把“协程”叫做greenthread。

所谓并发,就是开启了多个greenthread,并且对这些greenthread进行管理,以实现非阻塞式的I/O。

Eventlet特性:

A、非阻塞I/O模型

B、协程(Coroutines)使得开发者可以采用阻塞式的开发风格,却能够实现非阻塞I/O的效果

C、隐式事件调度,使得可以在Python解释器或者应用程序的某一部分去使用Eventlet

关于协程,大致可以理解成允许子程序可以多次暂停和恢复执行,是实现多任务的一种有效手段,Eventlet的基础是greenlet,这是实现"协程(Coroutine)"的基础。

协程又被称作"微线程“,简单点说就是在一个原生线程上通过"拷贝"和"切换"堆栈帧数据来实现执行多个工作,看上去和传统的"单CPU,多线程(Threading)"执行方式差不多

 

Eventlet的安装:

Windows下安装

1、从

2、在cmd中输入python,出现如下显示,表明安装python安装成功

3、进入cmd下,输入"easy_installeventlet"命令就会从互联网上下载并自动安装eventlet到python目录中(目录示例:

C:

\Python27\Lib\site-packages\eventlet-0.9.17-py2.7.egg\eventlet)

4、输入python,进入python环境,输入importeventlet命令,出现以下输出表明eventlet安装成功

Linux下安装:

wget

tar-zxfActivePython-2.7.2.5-linux-x86_64.tar.gz

cdActivePython-2.7.2.5-linux-x86_64

makeinstall

easy_installeventlet

关于eventlet可以参照eventlet的官方网站:

importeventlet

pool=eventlet.GreenPool(10000)

whileTrue:

pool.spawn(func,args)

 

说明:

1、GreenPool用来实现协程,保证并行

2、pool=eventlet.GreenPool(10000)创建一个可以处理10000个客户端连接的线程池,

应用场景:

做一个IM原型时,服务器需要处理多客户端连接但又不想使用传统的多线程编程。

3、spawn()启动一个GreenThread执行目标函数完成具体业务.

4、每个func之间切换,实施“你运行一会、我运行一会”,并且在进行切换时必须指定何时切换以及切换到哪,当出现阻塞时,就显式切换到另一段没有被阻塞的代码段执行,直到原先的阻塞状况消失以后,再人工切换回原来的代码段继续处理.

5、eventlet可以用来处理多线程方面的工作,但它使用的是greenthreads概念,所以用资源的开销很少。

Eventlet中常用类说明:

greenthread

1)sleep(seconds=0):

中止当前的GreenThread,以允许其它的GreenThread执行。

2)spawn(func,*args,**kwargs):

创建一个GreenThread去运行func这个函数,*args,**kwargs是传递给func的参数。

返回值是一个eventlet.GreenThread对象,这个对象可以用来接受func函数运行的返回值。

3)spawn_n(func,*args,**kwargs):

这个函数和spawn()有点类似,不同的是它没有返回值,因此效率更高。

4)spawn_after(seconds,func,*args,**kwargs):

这个函数和spawn()基本上一样,都有一样的返回值,不同的是它可以限定在什么时候执行这个GreenThread,即在seconds秒之后,启动这个GreenThread

ps:

源码地址

C:

\Python27\Lib\site-packages\eventlet-0.9.17-py2.7.egg\eventlet\greenthread.py

GreenPool

这是一个类,继承object,在这个类中用set集合来容纳所创建的GreenThread,并且可以指定容纳线程的最大数量(默认是1000个),它的内部是用Semaphore和Event这两个类来对池进行控制的,这样就构成了线程池。

其中,有几个比较重要的方法:

running(self):

返回当前池中正在执行函数的GreenThread数

free(self):

返回当前池中仍可容纳的GreenThread数

spawn(self,function,*args,**kwargs):

返回GreenThread,可以接受func函数执行后返回的结果

spawn_n(self,function,*args,**kwargs):

同spawn(self,function,*args,**kwargs),但是不返回结果

starmap(self,function,iterable)和imap(self,function,*iterables):

这两个函数和标准的库函数中的这两个函数实现的功能是一样的,所不同的是这里将这两个函数的执行放到了GreenThread中。

前者实现的是从iterable中取出每一项作为function的参数来执行,后者则是分别从iterables中各取一项,作为function的参数去执行。

如:

imap(pow,(2,3,10),(5,2,3))-->3291000

starmap(pow,[(2,5),(3,2),(10,3)])-->3291000

ps:

源码地址

C:

\Python27\Lib\site-packages\eventlet-0.9.17-py2.7.egg\eventlet\greenpool.py

GreenPile

这也是一个类,继承object,在它内部维护了一个GreenPool对象和一个Queue对象。

这个GreenPool对象可以是从外部传递进来的,也可以是在类内部创建的,GreenPool对象主要是用来创建GreenThread的,即在GreenPile内部调用了GreenPool.spawn()方法。

而Queue对象则是用来保存spawn()方法的返回值的,即Queue中保存的是GreenThread对象。

并且它还实现了next()方法,也就意味着GreenPile对象具有了迭代器的性质。

所以如果我们要对GreenThread的返回值进行操作的话,用这个类是再好不过的了。

ps:

源码地址

C:

\Python27\Lib\site-packages\eventlet-0.9.17-py2.7.egg\eventlet\greenpool.py

 

Queue

继承LightQueue,Queue中包含了两个方法:

task_done()å’Œjoin()

task_done()是被GreenThread所调用的,表示在这个项上的所有工作都做完了

join()是阻塞,直到队列中所有的任务都完成。

LifoQueue和PriorityQueue都是Queue的子类,是存放数据的两种不同的方式。

LifoQueue检索的规则是最近加入的最先检索

PriorityQueue检索的规则是优先级最低的最先检索

ps:

源码地址

C:

\Python27\Lib\site-packages\eventlet-0.9.17-py2.7.egg\eventlet\queue.py

NetworkConvenienceFunctions(和网络相关的函数)

这些函数定义在convenience.py文件中,对和socket相关的网络通信进行了包装,注意,这里用的socket是经过修改后的socket,以使它使用绿GreenThread,主要有以下方法:

1)connect(addr,family=socket.AF_INET,bind=None)

主要执行了以下几个步骤:

新建了一个TCP类型的socket,绑定本地的ip和端口,和远程的地址进行连接,源码如下:

 

defconnect(addr,family=socket.AF_INET,bind=None):

sock=socket.socket(family,socket.SOCK_STREAM)

ifbindisnotNone:

sock.bind(bind)

sock.connect(addr)

returnsock

 

参数说明:

addr:

需要连接的服务器的地址,对于TCPsockets来说,addr是一个元组(host,port)

Family:

socketfamily,可选

Bind:

需要绑定的本地地址,可选

2)listen(addr,family=socket.AF_INET,backlog=50)

过程和connect()类似,只是把connect()换成了listen(),backlog指定了最大的连接数量,源码如下:

deflisten(addr,family=socket.AF_INET,backlog=50):

sock=socket.socket(family,socket.SOCK_STREAM)

ifsys.platform[:

3]!

="win":

sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

sock.bind(addr)

sock.listen(backlog)

returnsock

 

参数说明:

addr:

监听的地址,对于TCPsockets来说,是一个元组(host,port)

socketfamily,可选

backlog:

队列连接最大数,最小为1

3)serve(sock,handle,concurrency=1000)

这个函数直接创建了一个socket服务器,在它内部创建了一个GreenPool对象,默认的最大GreenThread数是1000,然后是一个循环来接受连接,源码如下:

defserve(sock,handle,concurrency=1000):

pool=greenpool.GreenPool(concurrency)

server_gt=greenthread.getcurrent()

whileTrue:

try:

conn,addr=sock.accept()

gt=pool.spawn(ha

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1