1. 什么是协程?
协程(coroutine),又称微线程。协程不是线程也不是进程,它的上下文关系切换不是由CPU控制,一个协程由当前任务切换到其他任务由当前任务来控制。一个线程可以包含多个协程,对于CPU而言,不存在协程这个概念,它是一种轻量级用户态线程(即只针对用户而言)。协程拥有自己的寄存器上下文和栈,协程调度切换到其他协程时,将寄存器上下文和栈保存,在切回到当前协程的时候,恢复先前保存的寄存器上下文和栈。
2. 在编程中为什么要使用协程?
使用协程的好处:(1)CPU无需负担上下文的开销;(2)不需加锁(多个线程操作数据时得加锁);(3)由程序员切换控制流,方便编程;(4)高并发、高扩展、低成本(一个CPU支持上万的协程都不是问题)。
当然,任何事物有优点必有缺点。协程得缺点:(1)协程自己无法利用CPU多核资源(除非与多进程或者多线程配合);(2)遇到阻塞操作会使整个程序阻塞。
例一(使用yield实现在任务间的切换):
1 import time 2 3 def func1(name): 4 print("----func1 start...----") 5 for i in range(6): 6 temp = yield #每次遇到yield,func1在此处阻塞,直到temp接收到func2中con.send()传来的值 7 print("%s in the func1" % (str(temp))) 8 time.sleep(1) 9 10 11 def func2(): 12 print("----func2 start...----") 13 con.__next__() #此处开始真正的func1的调用 14 for i in range(5): 15 con.send(i+1) 16 print("%s in the func2" % i) 17 18 19 if __name__ == '__main__': 20 con = func1(1) #在有yield的函数中此处不是真正的函数调用,打印con便可知道 21 # print(con) 22 p = func2()