协程
协程,又称微线程,协程是一种用户态的轻量级线程(操作系统根本就不知道他的存在,是用户自己控制的)
协程是一种函数,特点是其处理过程可以在特定点挂起和恢复,因此典型情况下,协程将执行到某个特定的语句,之后执行过程被挂起等待某些数据,在这个挂起点上,程序是的其他部分可以继续执行,一旦数据到来,协程就从其他挂起点恢复执行,执行一些处理,并可能将其处理结果发送给另一个协程,协程可以有多个入口点和退出点,因为挂起和恢复执行的位置都不止一处。
在需要将多个函数应用与同样的数据时,或者是需要创建数据处理流水线时,或者是某个主数带有几个函数时,协程都是有用的,协程也可以作为线程的替代,并且更加简单,负载也更低。
在Python中,协程是一个从yield表达式中提取输入的函数,也可以将处理结果发送给接收者函数(该函数本身必须是一个协程)。
协程的好处与缺点
优点
无需线程上下文切换的开销
无需原子操作锁定以及同步的开销
方便切换控制流,简化编程模型
高并发+高扩展性+低成本。一个CPU支持上万的协程都不是问题
缺点
无法利用多核资源:协程本质是单线程,他不能同时将单个CPU的多个核用上,协程需要和进程配合才能运行在多CPU上。
进行阻塞操作会阻塞掉整个程序。因此我们需要解决这个问题,才能进行大范围的运用。比如说如果在程序运行中遇到I/O操作就会被阻塞从而造成程序的阻塞。因此我们需要在他阻塞的时候切换到另一个函数。
例子
yield协作的例子
import time
def producer():
"用于把生产的产品发生给客户"
#做准备
c1.next()
c2.next()
c3.next()
n=0
#给他们5个产品
while n<5:
n+=1
time.sleep(2) #制作时间
c1.send(n)
c2.send(n)
c3.send(n)
print "\033[31;0mprodecer making baozi\033[1m"
pass
def consumer(name):
"客户接受生产者的产品"
while True:
print