高级编程技巧——协程2

本文详细介绍了Python中的协程,从协程的基本概念到实现方式,包括yield实现的生成器、yield from的使用、greenlet和gevent库的应用,最后探讨了异步编程,特别是async/await关键字在协程中的作用,以及如何利用tasks进行并发调度。
摘要由CSDN通过智能技术生成

10 协程2

10.1 协程简介

协程介绍

  • 协程,又称为微线程,它是实现多任务的另一种方法,只不过比线程更小的执行单元,因为它自带CPU的上下文,这样只要在合适的时机,我们就要=可以把一个协程切换到另一个协程。

CPU上下文(CPU寄存器和程序计数器):

  • CPU寄存器就是CPU的内置的容量小,但速度极快的内存。
  • 程序计数器则是用来存储CPU在在执行的指令位置,或者即将执行的下一条指令位置。

协程与线程差异

  • 线程:每个线程都有自己缓存Cache 等等数据,操作系统还会做这些数据的恢复操作,所以线程的切换非常消耗性能。
  • 协程:单纯的操作CPU的上下文,所以一秒切换上百万次系统都能抗住。所以完成多任务的效率比线程和进程都高。

10.2 yield 实现协程

  • yield 实现协程
import time
def task1():
    while True:
        print('--1--')
        time.sleep(0.1)
        yield
def task2():
    while True:
        print("--2--")
        time.sleep(0.1)
        yield
def main():
    t1=task1()
    t2=task2()
    while True:
        next(t1)
        next(t2)
if __name__=='__main__':
    main()

生成器扩展

  • next(g) 预激活
  • g.send(None) 预激活
  • g.send('需发送的值‘)激活yield 并且发送值
    • 注意:此前必须有激活也就是next(g) 或g.send(None)
  • 生成器函数的返回值在在异常中
def create_num(num):
    a,b=0,1
    current_num=0
    while current_num <num:
        res=yield a   # 1.yield a  2.赋值
        print(res)
        a,b=b,a+b
        current_num+=1

    return '
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值