外观
前置知识
生成器
例:
def fun():
print('---------start---------')
while True:
yield '生成器返回的数据....'
g = fun()
print(next(g))
print('*' * 20)
print(next(g))运行结果:
---------start---------
生成器返回的数据....
********************
生成器返回的数据....由以上代码得知生成器在第二个运行的时候会根据上一次运行的状态继续向下执行。利用这一个特性我们可以使用生成器进行任务之间的切换。
使用
yield实现协程
import time
def func_a():
while True:
print('-------A-------')
yield
time.sleep(0.5)
def func_b(obj):
while True:
print('---------B------------')
obj.__next__()
a = func_a()
func_b(a)打印结果:
---------B------------
-------A-------
---------B------------
-------A-------
---------B------------
-------A-------
---------B------------当前程序不断交替执行,完成了程序之间的切换。
异步IO
- 同步:先执行第一个事务,如果遇到阻塞,则进行等待直到第一个事务执行完毕,再执行第二个事务。
import time
def foo():
time.sleep(1)
now = lambda: time.time()
start = now()
for i in range(5):
foo()
print('同步所花费的时间: %f s' % (now() - start))打印结果:
同步所花费的时间: 5.004482 s- 异步:执行第一个事务之后,如果遇到阻塞,则会执行第二个事务,不会等待。可以通过状态、通知、回调来调用处理结果。
import time
import asyncio
now = lambda: time.time()
async def fun():
await asyncio.sleep(1) # 正确的异步写法
print('我是async任务...')
async def main():
tasks = [fun() for _ in range(5)] # 创建多个异步任务
await asyncio.gather(*tasks) # 并发执行所有任务
start = now()
asyncio.run(main()) # 启动主事件循环
print('异步所花费的时间: %f s' % (now() - start))打印结果:
我是async任务...
我是async任务...
我是async任务...
我是async任务...
我是async任务...
异步所花费的时间: 1.000891 s