python基础 29 专题 携程

149 阅读2分钟

一 简述

协程:微线程,纤程 coroutine 
是一种用户态的轻量级线程 
协程的典型代表:生成器---yield 
1. 协程是不存在的,是抽象的概念,没有协程对象,是一种运行机制 
2. 定义: 
    协程,是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序 
    

二 yield生成器(用yield实现协程)

yield:生产 
语法:
    yield# 生成并返回该值

1. 一个带有yield的函数,该函数的返回值为生成器对象(generator) 
生成器:是一个特殊的迭代器 
    是一个可迭代对象 
    使用next()或 __next__()查看下一个元素 
    
def f(n): 
    count,a,b=0,0,1 
    while count
        a,b=b,a+b 
        yield a 
        count+=1 
fib=f(12) 
for i in fib: 
    print(i,end=' ')
        
1. next()函数可以调用生成器中yield 所声明的值,每一次值会调用一个yield 
2. yield 相当于协程入口,流程会在yield入口处暂停(中断)此时yield后面的代码不会执行,直到下一次调用 next函数 
3. next()如何没有找到yield声明的值,则会报错StopIteration 
4. 当程序中断时,对于协程,不会占用任何资源 程序在运行时才会占用资源
5. send(value)方法
    1. 返回传入的值,并触发一次yield 
        会调用一次next() 
    2. send的值会作为yield的返回值进行传递 
6. a=yield a 语法正确,但是此时yield不会给等号前的a赋值(此时等号前的a为None) 
    等号前面的a应该有send()进行赋值 
7. yield 100 返回的值为100
8. yield生成器是典型的生产者小费者模型: 按需供应


def fun(): 
    a=10 
    a= yield a 
    print('a:%s'%a) 
    yield 100 
    
f=fun() 
print(next(f)) 
print(f.send(30))

三 协程的优缺点

优点: 
    1. 无需线程上下文切换的开销,协程避免了无意义的调度,可以提高性能 
    2. 无需原子操作锁定以及同步的开销 
    3. 方便切换流程控制,简化编程模型 
    4. 高并发+高扩展+低成本:
        一个单核CPU可以支持上万个协程
缺点: 
    1. 无法利用多核资源 
    2. 发生阻塞操作,会阻塞掉整个程序