greenlet协程库

48 篇文章 11 订阅
eventlet也是一个协程库,它封装了greenlet,这个封装有两层含义:一个是封装了协程的调度,另一个含义是它是一个网络处理相关的协程库。
为什么说它是一个与网络处理相关的协程库呢?先看下面这个例子。
import eventlet
import time
def test(s):
    print(s+"begin")
    time.sleep(1)
    print(s+"end")
    
pool =eventlet.GreenPool(3)
for i in range(3):
    pool.spawn(test(str(i)))
首先,简单解释一下这个例子中的两个关键的函数:
1 pool=eventlet.GreenPool(3):意思是创建一个size=3的空的协程池(eventlet称之为greenthread)。注意,这是一个空的协程池,最大能容纳3个协程。
2 pool.spawn(test(str(i))):意思是创建一个具体的协程,这个协程的具体的执行函数是“test(str(i))”,这就是一开始定义的函数:test(s) 。
另外,for i in range(3),这个for循环创建了3个协程(因为一开始创建的协程池大小是3,所以这里就创建了3个协程)。
上述程序运行的结果是:
0 begin
0 end
1 begin
1 end
2 begin
2 end
上面程序无论执行多少遍,其执行结果都是一样的。假设上述程序创建的不是协程池,而是线程池,其运行结果可能就不那么规整,而3个协程是按顺序执行的,即按协程1、协程2、协程3来接续执行。
线程的执行顺序是我们不能确定的,因为是操作系统在调度。但是为什么eventlet的协程调度这么规整,严格按照协程创建的顺序来执行呢?这就涉及eventlet的第二个含义:与网络处理相关。
eventlet实现是一个非阻塞的网络I/O。eventlet中的n个协程,当正在运行的协程发生网络阻塞时,eventlet就会调用另外一个协程来运行。潜台词是:当这个正在运行的协程没有发生网络阻塞时,eventlet就不会调用另外一个协程来运行,而是直到这个正在运行的协程运行结束,才调度另外的协程来运行。
基于以上的描述,eventlet协程库总结如下:
1 封装了协程(greenlet)。
2 提供了非阻塞的网络I/O处理。
3 不提供用户调度自己的协程方法,自己内部进行了协程调度。
4 当正在运行的协程发生网络I/O阻塞时,调度另一个(非网络阻塞的)协程运行。
可以看到,如果使用eventlet来编写计算密集型的程序,其实毫无意义。也正是因为Neutron不是计算密集型的应用,而且正好是需要一个非阻塞网络I/O处理机制,所以Neutron选择了eventlet。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值