协程的优点(Python)

  • 协程的优点: 
  • 协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,
     而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态。
  • 协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制。因此,没有线程切换的开销,和多线程相比,线程数量越多,相同数量的协程体现出的优势越明显
  • 不需要多线程的锁机制。由于只有一个线程,也不存在同时写变量的冲突,在协程中控制共享资源不需要加锁,只需要判断数据的状态,所以执行效率远高于线程 ,对于多核CPU可以使用多进程+协程来尽可能高效率地利用CPU。

 生产者消费者模型通过协程的yield思想实现:

           
import time

def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return

        print('[消费者] <--- Consuming %s...' % n)
        time.sleep(1)
        r = 'ok'

def producer(c):
    next(c)
    n = 0
    while n < 5:
        n = n + 1
        print('[生产者] ---> Producing %s...' % n)
        # 和next有同样的同能,可以触发函数到下一个yield,
        # 区别于next的是可以像yield的左边的变量传值,例如上面yield左边的n
        c_ret = c.send(n)  

        print('[生产者] Consumer return %s' % c_ret)
    c.close()


if __name__ == '__main__':
    c = consumer()
    producer(c)
结果如下:
    
[生产者] ---> Producing 1...
[消费者] <--- Consuming 1...
[生产者] Consumer return ok
[生产者] ---> Producing 2...
[消费者] <--- Consuming 2...
[生产者] Consumer return ok
[生产者] ---> Producing 3...
[消费者] <--- Consuming 3...
[生产者] Consumer return ok
[生产者] ---> Producing 4...
[消费者] <--- Consuming 4...
[生产者] Consumer return ok
[生产者] ---> Producing 5...
[消费者] <--- Consuming 5...
[生产者] Consumer return ok

可以看出通过协程协程实现的生产者消费者模型是一种可控的生产消费模型,在消费者producer调用send之后启动生产者,实现可控的生产者消费者之间的通信。 
使用yield手动实现协程是比较麻烦的,Python提供了greenlet和gevent模块用来实现协程。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LIJZ_Python

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

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

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

打赏作者

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

抵扣说明:

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

余额充值