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、从下载ActivePython的安装文件,安装ActivePython,在环境变量中添加python(CLASSPATH和PATH中都需要)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关于eventlet可以参照eventlet的官方网站:=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中常用类说明:greenthread1)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秒之后,启动这个GreenThreadps:源码地址C:\Python27\Lib\site-packages\eventlet-0.9.17-py2.7.egg\eventlet\greenthread.pyGreenPool这是一个类,继承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))--3291000starmap(pow,[(2,5),(3,2),(10,3)])--3291000ps:源码地址C:\Python27\Lib\site-packages\eventlet-0.9.17-py2.7.egg\eventlet\greenpool.pyGreenPile这也是一个类,继承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.pyQueue继承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.pyNetworkConvenienceFunctions(和网络相关的函数)这些函数定义在convenience.py文件中,对和socket相关的网络通信进行了包装,注意,这里用的socket是经过修改后的socket,以使它使用绿GreenThread,主要有以下方法:1)connect(addr,family=socket.AF_INET,bind=None)主要执行了以下几个步骤:新建了一个TCP类型的socket,绑定本地的ip和端口,和远程的地址进行连接,源码如下:参数说明:addr:需要连接的服务器的地址,对于TCPsockets来说,addr是一个元组(host,port)Family:socketfamily,可选Bind:需要绑定的本地地址,可选2)listen(addr,family=socket.AF_INET,backlog=50)过程和connect()类似,只是把connect()换成了listen(),backlog指定了最大的连接数量,源码如下:参数说明:addr:监听的地址,对于TCPsockets来说,是一个元组(host,port)socketfamily,可选backlog:队列连接最大数,最小为1defconnect(addr,family=socket.AF_INET,bind=None):sock=socket.socket(family,socket.SOCK_STREAM)ifbindisnotNone:sock.bind(bind)sock.connect(addr)returnsockdeflisten(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)returnsock3)serve(sock,handle,concurrency=1000)这个函数直接创建了一个socket服务器,在它内部创建了一个GreenPool对象,默认的最大GreenThread数是1000,然后是一个循环来接受连接,源码如下:ps:源码地址C:\Python27\Lib\site-packages\eventlet-0.9.17-py2.7.egg\eventlet\convenience.pyTPoolTPool的定义为Simplethreadpool(简单的线程池),TPool中的线程大小默认为20,可以在引入TPool前通过配置环境变量EVENTLET_THREADPOOL_SIZE来更改线程池的大小。TPool中主要方法定义为:execute(meth,*args,**kwargs)该方法的含义为:在一个python的线程中执行meth方法时,会锁住当前greenthread直到meth执行完成defserve(sock,handle,concurrency=1000):pool=greenpool.GreenPool(concurrency)server_gt=greenthread.getcurrent()whileTrue:try:conn,addr=sock.accept()gt=pool.spawn(handle,conn,addr)gt.link(_stop_checker,server_gt,conn)conn,addr,gt=None,None,NoneexceptStopServe:returnExample:EventEvent跟Queue很相似,但是Event只能