协程:
基于单线程来实现并发。
协程并不是实际存在的实体,本质上是一个线程的多个部分。
比线程的单位更小——协程,纤程,在一个线程中可以开启很多协程。
在执行程序的过程中,遇到 IO 操作就冻结当前位置的状态,去执行其他任务,在执行其他任务的过程中,会不断地检测上一个冻结的任务是否 IO 结束,如果 IO 结束了,就继续从冻结的位置开始执行。
一个线程不会遇到阻塞——一直在使用CPU。
多个线程——只能有一个线程使用CPU。
协程比线程之间的切换和线程的创建销毁所花费的时间,空间开销要小的多。
协程的特点:冻结当前程序/任务的执行状态,可以规避IO操作的时间。
import time def producer(): res = [] for i in range(1000000): res.append(i) return res def consumer(res): for i in res:pass start = time.time() res = producer() consumer(res) print(time.time()-start) # 0.26484227180480957 def producer(): for i in range(1000000): yield i def consumer(): g = producer() for i in g:pass start = time.time() consumer() print(time.time() - start) # 0.09993767738342285 import time def consumer(): while True: x=yield def producer(): g=consumer() next(g) for i in range(10000000): g.send(i) start = time.time() producer() print(time.time() - start) # 1.6259949207305908 # 单纯的切换,还是要耗费一些时间的,记住当前执行的状态。 # 用时间换了空间