Table of Contents
前言
由于 cpu和 磁盘读写的 效率有很大的差距,往往cpu执行代码,然后遇到需要从磁盘中读写文件的操作,此时主线程会停止运行,等待IO操作完成后再继续进行,这要就导致cpu的利用率非常的低。
协程可以实现单线程同时执行多个任务,但是需要自己手动的通过send函数和yield关键字配合来传递消息,asyncio模块能够自动帮我们传递消息。
在介绍asyncio模块之前我们先来了解一下yield from 关键字
yield from
作用1 包含yield from 关键字的函数也会编程一个generator对象。
作用2 yield from 关键字后面是一个iterable对象,其含义与下面类似
for item in iterable:
print(item)
看案例
>>> def test1():
yield [1,2,3,4,5]
>>> t1 = test1()
>>> next(t1)
[1, 2, 3, 4, 5]
-----------------------------------------------------------------------------------------
>>> def test1():
yield from [1,2,3,4,5]
>>> t=test1()
>>> next(t)
1
>>> next(t)
2
>>> next(t)
3
>>> next(t)
4
>>> next(t)
5
如果yield from 关键字后面是一个generator对象,又因为包含yield from的函数也会变成Iterator对象,所以之后迭代该Iterator对象,实际上迭代的是yield from 后面的Iterator对象,话说起来比较绕
看个简单的案例
>>> def test1():
a = 0
while 1:
a = a+1
yield a
>>> def test2():
yield from test1()
>>> t2=test2()
>>> next(t2) # 实际迭代的是test1这个generator
1
>>> next(t2)
2
>>> next(t2)
3
>>> next(t2)
4
>>> next(t2)
5
再看一个案例
def htest():
i = 1
while i < 4:
print('i', i)
n = yield i
print('n', n)
if i == 3:
return 100
i += 1
def itest():
val = yield from htest()
print(val)
t = itest()
print(type(t))
t.send