-
协程概念:
单线程实现并发
在应用程序里控制多个任务的切换+保存状态 -
优点:
应用程序级别速度要远远高于操作系统的切换
-
缺点:
-
多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地,该线程内的其他的任务都不能执行了
-
一旦引入协程,就需要检测单线程下所有的IO行为,实现遇到IO就切换,少一个都不行,因为一旦一个任务阻塞了,整个线程就阻塞了,其他的任务即便是可以计算,但是也无法运行了
-
-
协程序的目的:
想要在单线程下实现并发
并发指的是多个任务看起来是同时运行的
并发=切换+保存状态
yield就是一种在单线程下可以保存任务运行状态的方法
- yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级
- 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