Eventlet学习总结汇编Word文档下载推荐.docx
《Eventlet学习总结汇编Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Eventlet学习总结汇编Word文档下载推荐.docx(8页珍藏版)》请在冰豆网上搜索。
拷贝"
和"
切换"
堆栈帧数据来实现执行多个工作,看上去和传统的"
单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:
源码地址
\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)])-->
ps:
\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的返回值进行操作的话,用这个类是再好不过的了。
Queue
继承LightQueue,Queue中包含了两个方法:
task_done()å
’Œjoin()
task_done()是被GreenThread所调用的,表示在这个项上的所有工作都做完了
join()是阻塞,直到队列中所有的任务都完成。
LifoQueue和PriorityQueue都是Queue的子类,是存放数据的两种不同的方式。
LifoQueue检索的规则是最近加入的最先检索
PriorityQueue检索的规则是优先级最低的最先检索
\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
监听的地址,对于TCPsockets来说,是一个元组(host,port)
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