协程

本文深入探讨了协程和生成器的概念,解释了协程如何通过非抢占式的程序控制来提高执行效率,避免线程切换的开销,并讨论了其在IO操作中的应用。同时,文章对比了协程与多线程的锁机制,展示了协程在控制共享资源方面的优势,以及如何结合多进程充分利用多核CPU。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

协程:协作式------非抢占式的程序
A------>B------>A------C
yield(协程)
用户态的切换
key:什么时候切换
协程主要解决的也是操作IO操作
协程本质上就是一个县城
协程的优势:
1 没有切换的消耗
2 没有锁的概念
有一个问题:能用多核吗?可以采用多进程程+协程一个很好的解决并发的方案

生成器

def f():
    print('ok')
    s = yield 6
    print(s) # 5
    print('ok2')
    yield


gen = f()
Ret = gen.__next__()  # ok
print(Ret)  # 6

gen.send(5)
# gen.__next__()  # ok2

协程

协程,又称微线程,纤程。英文名Coroutine。
优点1:协程级高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程化,线程数量越多,协程的性能优势就越明显。
有点2:不需要多线程的锁机制,因为只有一把锁,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

import time


def consumer(name):
    print('%s等着吃包子' % name)
    while True:
        baozi = yield
        print('%s吃了第%s个包子' % (name, baozi))

def producer():
    next(con1)
    next(con2)
    n = 0
    while True:
        time.sleep(1)
        print('------包子------%s and %s' % (n, n + 1))
        con1.send(n)
        con2.send(n + 1)
        n = n + 2


if __name__ == '__main__':
    con1 = consumer('c1')
    con2 = consumer('c2')
    producer()

Greenlet

greenlet是一个用C实现的协程模块,相比与python自带的yeild,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值