1、Eventlet学习总结汇编Eventlet定义:eventlet是一个用来处理和网络相关的python网络库,而且可以通过协程来实现并发,在eventlet里,把“协程”叫做greenthread。所谓并发,就是开启了多个greenthread,并且对这些greenthread进行管理,以实现非阻塞式的I/O。 Eventlet特性:A、非阻塞I/O模型B、协程(Coroutines)使得开发者可以采用阻塞式的开发风格,却能够实现非阻塞I/O的效果 C、隐式事件调度,使得可以在Python解释器或者应用程序的某一部分去使用Eventlet 关于协程,大致可以理解成允许子程序可以多次暂停和恢复
2、执行,是实现多任务的一种有效手段,Eventlet的基础是greenlet,这是实现协程(Coroutine) 的基础。协程又被称作 微线程“,简单点说就是在一个原生线程上通过拷贝和切换 堆栈帧数据来实现执行多个工作,看上去和传统的单CPU,多线程(Threading)执行方式差不多 Eventlet的安装:Windows下安装1、从2、在cmd中输入python,出现如下显示,表明安装python安装成功3、进入cmd下,输入easy_install eventlet命令就会从互联网上下载并自动安装eventlet到python目录中(目录示例:C:Python27Libsite-packa
3、geseventlet-0.9.17-py2.7.eggeventlet)4、输入python,进入python环境,输入import eventlet命令,出现以下输出表明eventlet安装成功Linux下安装:wget tar -zxf ActivePython-2.7.2.5-linux-x86_64.tar.gz cd ActivePython-2.7.2.5-linux-x86_64make installeasy_install eventlet关于eventlet可以参照eventlet的官方网站: import eventletpool = eventlet.GreenPoo
4、l(10000)while True: pool.spawn(func,args) 说明:1、GreenPool 用来实现协程,保证并行2、pool = eventlet.GreenPool(10000) 创建一个可以处理 10000 个客户端连接的线程池, 应用场景:做一个 IM 原型时,服务器需要处理多客户端连接但又不想使用传统的多线程编程。3、spawn() 启动一个 GreenThread 执行目标函数 完成具体业务. 4、每个func之间切换,实施“你运行一会、我运行一会”,并且在进行切换时必须指定何时切换以及切换到哪,当出现阻塞时,就显式切换到另一段没有被阻塞的代码段执行,直到原先
5、的阻塞状况消失以后,再人工切换回原来的代码段继续处理.5、eventlet 可以用来处理多线程方面的工作,但它使用的是 green threads 概念,所以用资源的开销很少。Eventlet中常用类说明:greenthread 1)sleep(seconds=0):中止当前的GreenThread,以允许其它的GreenThread执行。 2)spawn(func,*args,*kwargs): 创建一个GreenThread 去运行func这个函数,*args,*kwargs是传递给func的参数。返回值是一个eventlet .GreenThread对象,这个对象可以用来接受func函数
6、运行的返回值。 3) spawn_n(func,*args,*kwargs):这个函数和spawn()有点类似,不同的是它没有返回值,因此效率更高。 4) spawn_after(seconds,func,*args,*kwargs):这个函数和spawn()基本上一样,都有一样的返回值,不同的是它可以限定在什么时候执行这个GreenThread,即在seconds秒之后,启动这个GreenThread ps:源码地址C:Python27Libsite-packageseventlet-0.9.17-py2.7.eggeventletgreenthread.pyGreenPool 这是一个类,
7、继承object,在这个类中用set集合来容纳所创建的GreenThread,并且可以指定容纳线程的最大数量(默认是1000个),它的内部是用Semaphore和Event这两个类来对池进行控制的,这样就构成了线程池。其中,有几个比较重要的方法: running(self):返回当前池中正在执行函数的GreenThread数 free(self):返回当前池中仍可容纳的GreenThread数 spawn(self, function, *args, *kwargs):返回GreenThread ,可以接受func函数执行后返回的结果 spawn_n(self, function, *args
8、, *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) - 32
9、 9 1000 starmap(pow, (2,5), (3,2), (10,3) - 32 9 1000ps:源码地址C:Python27Libsite-packageseventlet-0.9.17-py2.7.eggeventletgreenpool.pyGreenPile 这也是一个类,继承object,在它内部维护了一个GreenPool对象和一个Queue对象。这个GreenPool对象可以是从外部传递进来的,也可以是在类内部创建的,GreenPool对象主要是用来创建GreenThread的,即在GreenPile内部调用了GreenPool.spawn()方法。而Queue对象
10、则是用来保存spawn()方法的返回值的,即Queue中保存的是GreenThread对象。并且它还实现了next()方法,也就意味着GreenPile对象具有了迭代器的性质。所以如果我们要对GreenThread的返回值进行操作的话,用这个类是再好不过的了。ps:源码地址C:Python27Libsite-packageseventlet-0.9.17-py2.7.eggeventletgreenpool.pyQueue 继承LightQueue,Queue中包含了两个方法:task_done()join() task_done()是被GreenThread所调用的,表示在这个项上的所有工作
11、都做完了join()是阻塞,直到队列中所有的任务都完成。 LifoQueue和PriorityQueue都是Queue的子类,是存放数据的两种不同的方式。 LifoQueue检索的规则是最近加入的最先检索PriorityQueue检索的规则是优先级最低的最先检索ps:源码地址C:Python27Libsite-packageseventlet-0.9.17-py2.7.eggeventletqueue.pyNetwork Convenience Functions(和网络相关的函数) 这些函数定义在convenience.py文件中,对和socket相关的网络通信进行了包装,注意,这里用的so
12、cket是经过修改后的socket,以使它使用绿GreenThread,主要有以下方法: 1)connect(addr, family=socket.AF_INET, bind=None) 主要执行了以下几个步骤:新建了一个TCP类型的socket,绑定本地的ip和端口,和远程的地址进行连接 ,源码如下:def connect(addr, family=socket.AF_INET, bind=None): sock = socket.socket(family, socket.SOCK_STREAM) if bind is not None: sock.bind(bind) sock.con
13、nect(addr) return sock 参数说明:addr:需要连接的服务器的地址,对于TCP sockets来说,addr是一个元组 (host, port)Family:socket family,可选Bind:需要绑定的本地地址,可选2)listen(addr, family=socket.AF_INET, backlog=50) 过程和connect()类似,只是把connect()换成了listen(),backlog指定了最大的连接数量,源码如下:def listen(addr, family=socket.AF_INET, backlog=50): sock = socke
14、t.socket(family, socket.SOCK_STREAM) if sys.platform:3 != win: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(addr) sock.listen(backlog) return sock参数说明:addr:监听的地址,对于TCP sockets来说,是一个元组(host, port)socket family,可选backlog:队列连接最大数,最小为13)serve(sock, handle, concurrency=1000) 这个函数直接创建了一个socket服务器,在它内部创建了一个GreenPool对象,默认的最大GreenThread数是1000,然后是一个循环来接受连接,源码如下:def serve(sock, handle, concurrency=1000): pool = greenpool.GreenPool(concurrency) server_gt = greenthread.getcurrent() while True: try: conn, addr = sock.accept() gt = pool.spawn(ha
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1