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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haeasringnar/article/details/79978481

”’
协程:协程是一种用户化的线程,类似于微线程
协程能保留上一次的调用状态,在单线程下实现并发的效果
协程的好处:
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__()
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页