Python初识协程已经最经典的yeild生产者消费者模型

”’
协程:协程是一种用户化的线程,类似于微线程
协程能保留上一次的调用状态,在单线程下实现并发的效果
协程的好处:
1、无须线程上下文切换的开销
2、无须原子操作锁定及同步的开销,原子操作就是一个最小的操作,如一个线程改一个数
3、方便切换控制流,简化编程模型
4、高并发、高扩展性、低成本:一个cpu支持上万的协程都不是问题,所以很适合用于高并发处理
缺点:
1、无法利用多核资源:协程的本质就是单线程,它不能同时将单个cpu的多核用上,
协程需要配合进程才能运行在多个cpu上,当然日常开发中没有这个必要,除非cpu密集型应用
2、进行阻塞操作(如IO时)会阻塞掉整个程序
”’

import time
# 这是一个消费者 一直在等待完成吃包子的动作
def consumer(name):
    print('%s准备吃包子了!'%name)  #打印出对应的消费者的名字
    while True:   #执行一个死循环 实际上就是需要调用时才会执行,没有调用就会停止在yield
        baozi = yield  #在它就收到内容的时候后就把内容传给baozi
        print('包子【%s】来了,被【%s】吃了'%(baozi,name))
def producer(name):
    c1 = consumer('A')  #它只是把c1变成一个生成器
    c2 = consumer('B') #有yield时第一次会把函数变成生成器,并不会直接调用函数
    c1.__next__() #第一个next只是会走到yield然后停止
    c2.__next__()
    print('老子开始做包子了')
    for i in range(1,10):
        time.sleep(1)
        print('三秒做了两个包子')
        c1.send(i)  #这一步其实就是调用next方法的同时传一个参数i给field接收,然后baozi=i
        c2.send(i+1)
        #其实这里是这样的,在send的时候只是继续执行yield下面的语句,然后去去yield,再次停在这儿

producer('aea')
c = consumer('aaa') #没next一次就会将程序执行一次
# c.__next__()
# c.__next__()
# c.__next__()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haeasringnar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值