Python3协程

1.协程

  • 协程,又称微线程,协程是一种用户态的轻量级线程。
  • 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此,协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,也就是进入上一次离开时所处逻辑流的位置。

1.1 协程的好处

  • 无需线程上下文切换的开销
  • 无需源自操作锁定及同步的开销
  • 方便切换控制流,简化编程模型
  • 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题,所以很适合用于高并发处理

1.2 协程的缺点

  • 无法利用多核资源:协程的本质是单个线程,不能同时将单个CPU的多核利用上,需和进程配合才能运行在多CPU上
  • 进行阻塞操作(如IO)时会阻塞整个程序

1.3 yield支持下的协程

import time
import queue
def consumer(name):             #生成器
    print('------>starting.......')
    while True:
        new_baozi = yield
        print("[%s] is eating baozi %s" %(name, new_baozi))
        # time.sleep(1)

def producer():
    next(con)           #执行consumer代码
    next(con2)
    n = 0
    while n < 5:
        n += 1
        print("\033[32;1m[producer]\033[0m is making baozi %s" % n)
        con.send(n)
        con2.send(n)

if __name__ == '__main__':
    con = consumer('c1')      #创建生成器对象
    con2 = consumer('c2')   #创建生成器对象
    p = producer()

1.4 gevent下的协程

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

import greenlet
def test1():
    print(12)
    gr2.switch()
    print(34)
    gr2.switch()

def test2():
    print(56)
    gr1.switch()
    print(78)

gr1 = greenlet.greenlet(test1)      #创建一个greenlet对象
gr2 = greenlet.greenlet(test2)
gr1.switch()

 

 

import gevent
import time
def foo():
    print("Running in foo", time.ctime())
    gevent.sleep(1)           #模拟真正的IO阻塞
    print("Explicit context switch to foo again", time.ctime())

def bar():
    print("Explicit context to bar", time.ctime())
    gevent.sleep(2)
    print("Implicit context switch back to bar", time.ctime())

gevent.joinall([gevent.spawn(foo), gevent.spawn(bar)])

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值