3.1事件循环
理解成为一个死循环,去检测并执行某些代码。
仿代码
任务列表-【任务1。任务2。任务3.]
while True:
可执行的任务列表,已完成的任务列表 = 去任务列表中检查所有的任务,将"可执行" 和 "已完成"的任务返回
for就绪任务 in可执行的任务列表:
执行已就堵旳任务
for已完成的任务 in已完成任务列表:
在任务列表中移除已完成任务
如果任务列表中的任务都已完成,则终止循环
import asyncio
# 去生成或获取一个事件循环
loop = asyncio.get_event_loop()
# 将任务放到"任务列表"
loop.run_until_complete(任务)
3.2快速上手
协程函致,定义函数时候async def 函数名
协程对象,抗行协程纽数D得到的协程对象。
async def funcO:
pss
result - funco
注意;执行协程函致刨建协程对象,函数内郎代码不会执行。
如果想要运行协程函数内部代码,必须要将协程对象交给事件循环来处理
import asyncio
async def func():
print("回家吃饭了")
result = func()
# 1oop = asyncio.get_event_loop()
# loop.run_unti_complete(result) # 通用的
asyncio.run(result) # 以上两句可以简写成一句 python3.7才有的简写
3.3 await
await +可等待的对象(协程对象, Future, Task对象-->IO等待)
import asyncio
async def func():
print("来玩")
respomse = await asyncio.sleep(2)
print("结束",response)
asyncio.run( func())
示例2:
import asyncio
async def others():
print("start")
await asyncio.sleep(2)
print("end")
return "返回值"
async def func():
print("执行协程函数内部代码")
# 遇到1O操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。当前协程挂起时,事件循环可以去执行其它协程(任务)
response = await others()
print("IO请求结来,结果为:",response)
asyncio.run(func())
示例3:
import asyncio
async def others():
print("start")
await asyncio.sleep(2)
print("end")
return "返网值"
async def func():
print("执行协程函数内部代码")
# 遇到1o操作挂起当前协程(任务), 等1O操作完成之后再继续往下纨行。当前协程挂起时,事件循环可以么执行其它协程(任务).
response1 = await othtrs()
print("io请求结果。response1结果为", response1)
response2 = await othtrs()
print("io请求结果。response2结果为", response2)
asyncio.run(func())
# await就是等待对象的值得到结果之后再继续向下处走。
白话:在事件循还中添加多个任务的。
Tasks用于并发调度协程,通过asyncio.create_task(协程对象)的方式创建Task对象,这样可以让协程加入事件循环中等待被调度执行。
除了使用asyncio.create_task()函数以外。还可以用低层级的loop.create_task( )或 ensure_future() 函效。不建议手动实例化Task对象。
注意;asyncio.create_task() 函数在Python3.7中被加入。在Python 3.7之前,可以改用低层级的asyncio.ensure_future()函数.
示例1:
import asymcio
async def func():
print(1)
amait asyncio.sleep(2)
print(1)
return "返回值"
async def main():
print("main开始")
task1 = asyncio.create_task(func()))
task2 = asyncio.create_task(func()))
print("main结束")
# 当执行某协程遭遇IO操作时,会自动化切换执行其他任务.
# 此处await是等待相对应的协程全都执行完毕并获取结果
ret1 = await task1
ret2 = await task2
print(ret1. ret2
asyncio.run(main())
示例2:
import asyncio
async def func():
print(1)
await asyncio.sleep(2)
print(2)
return "返密值"
async def main():
print("main开始")
task_1ist = [
asyncio.create task(func()),
asyncio.create task(func())
]
print("main结束了")
done.pending = await asyncio.wait(task_1ist.timecut=None)
print(done)
asyncio.run(main())
示例3:
import asyncio
async def func():
print(1)
await asyncio.sleep(2)
print(2)
return "返需值"
task_1ist =[
func(),
func()
]
done.pending = asyncio.run(asyncio.await(task_list))
print(done)