Python并发任务之协程

本文介绍了Python中协程的概念,作为轻量级的并发执行方式,协程避免了多线程的GIL限制,能实现高效的任务切换。通过关键字yield实现函数现场保存和恢复,协程可以实现单线程内的协作式任务处理。相比多线程,协程在上下文切换时消耗资源更少,结合多进程可充分利用多核CPU。gevent库提供了一个方便的协程支持,通过monkey.patch_socket()使IO模块非堵塞,实现高并发请求。

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

多线程会消耗系统资源,多进程则有GIL限制和影响,Python中还有一种高效地执行并发任务的方式,那就是协程了。

协程也成为微线程,比线程更轻量级。协程通过在单线程内进行函数执行切换来进行并发。也就是说,协程是单线程执行,并且在线程内函数之间的执行也是可以切换的。

如果说多进程、多线程是抢占式的任务处理方式,那么协程就是协作式的任务处理方式。协程虽然是单线程,但是通过协作切换来充分利用CPU,所以也可以实现高并发的场景。多进程时程序启动多个和自己一样的子进程,每个进程都有自己的GIL,所以多进程在多核CPU上不会受GIL的影响。多线程时程序会通过进程内的主线程来启动子进程。因为在同一个进程内,所有的线程都共同一个GIL,所以多线程在多核CPU上变为串行执行。协程是通过分割主进程的计算方法来实现的,在单线程的情况下,协程始终都能获得GIL,所以不会受GIL的影响。如果希望协程利用多核CPU的计算能力,那么只能通过多进程和协程配合的模式。

协程利用Python的实现,使用关键字yield来保持函数现场的能力,并在下次调用时再恢复函数的现场。即给yield添加接收信息的能力,那么就可以实现协程了:

伪代码如下:

def consumer():
    r = ''
    while True:
        n = yield r
        if not n:
            return 
        print("Consumer %s ..." % n)
        r = '200 OK'

def produce(c):
    c.next()
    n = 0
    while
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值