协程 gevent 模块(自动切换协程)

Gevent 模块

Gevent 是一个第三方库,可以轻松通过gevent 实现并发同步或异步编程,在gevent中用到的主要模式是 Greenlet,它是以C 扩展模块形式接入Python 的轻量级协程。Greenlet 全部运行在主程序操作系统进程的内部, 但他们被协作式地调度。

当一个greenlet遇到IO操作时,比如访问网络/睡眠等待,就自动切换到其他的greenlet,等到IO操作完成,再在适 当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程, 就保证总有greenlet在运行,而不是等待IO。同时也因为只有一个线程在执行,会极大的减少上下文切换的成本。

import gevent  #导入协程模块

#开发协程的案例 1.回答 2.问问题
def ask(name):
    print("%s:我要买个包"%name)
    gevent.sleep(1)  #人为模拟IO阻塞    (IO操作--->1.阻塞  2.需要等待 3.人为操作 的行为)
    print("%s:我想喝奶茶" % name)


def answer(name):
    print("%s:买 买 买"%name)
    gevent.sleep(1)
    print("%s:喝 喝 喝"%name)

if __name__ == '__main__':
    a=gevent.spawn(ask,'小乔')  #通过一个函数名字创建一个协程
    b=gevent.spawn(answer,'周瑜') #创建第二个协程

    gevent.joinall([a,b])  #把这两个任务当作协程自动切换 并且执行

注意:上例gevent.sleep(2)模拟的是gevent 可以识别的io 阻塞;

而time.sleep(2)或其他的阻塞,gevent 是不能直接识别的,需要加入一行代码monkey.patch_all(),这行代码需在 time,socket 模块之前。

IO 操作 

简单的可以理解为 阻塞/ 等待行为/人为操作需要等待 的操作 称为IO操作


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值