Python-4.29 协程

本文探讨了协程的概念,如何在单线程中实现并发执行,以及其优缺点。协程能提高应用程序级别的速度,通过yield保存任务状态,实现轻量级的任务切换。然而,一旦遇到阻塞,整个线程都会受到影响。通过示例展示了并发执行与串行执行的时间对比,强调了协程在实现并发上的效率优势。

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

  • 协程概念:

    单线程实现并发
    在应用程序里控制多个任务的切换+保存状态

  • 优点:

    应用程序级别速度要远远高于操作系统的切换

  • 缺点:

    1. 多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地,该线程内的其他的任务都不能执行了

    2. 一旦引入协程,就需要检测单线程下所有的IO行为,实现遇到IO就切换,少一个都不行,因为一旦一个任务阻塞了,整个线程就阻塞了,其他的任务即便是可以计算,但是也无法运行了

  • 协程序的目的:

    想要在单线程下实现并发
    并发指的是多个任务看起来是同时运行的
    并发=切换+保存状态

yield就是一种在单线程下可以保存任务运行状态的方法

  1. yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级
  2. send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换

并发执行

import time


def producer():
    g = consumer()
    next(g)
    for i in range(1000000):
        g.send(i)


def consumer():
    while True:
        res = yield


start_time = time.time()
producer()
stop_time = time.time()
print(stop_time - start_time)

结果:
0.21314430236816406

串行

import time


def producer():
    res = []
    for i in range(100000):
        res.append(i)
    return res


def consumer(res):
    pass


start_time = time.time()
res = producer()
consumer(res)
stop_time = time.time()
print(stop_time - start_time)

结果:
0.013007879257202148
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值