理解成一个死循环,去检测并执行某些代码
# 伪代码
任务列表 = [任务1,任务2,任务3,...]
while True:
可执行的任务列表,已完成的任务列表 = 去任务列表中检查所有任务,将'可执行'和'已完成'的任务返回
for 就绪任务 in 可执行的任务列表:
执行已就绪的任务
for 已完成的任务 in 已完成的任务列表:
在任务列表中移除 已完成的任务
import asyncio
# 去生成或获取一个事件循环
loop = asyncio.get_event_loop()
# 将任务放入到任务列表
loop.run_until_complete(任务)
协程函数,定义函数时候async def 函数名
。
协程对象,执行 协程函数()得到协程对象。
async def func():
pass
result = func()
注意:执行协程函数创建协程对象
如果想要运行协程函数内部代码,必须要将协程对象交给事件循环来处理。
import asyncio
async def func():
print('小黑想你啦!!!')
result = func()
asyncio.run(result)
await + 可等待对象(协程对象、Future、Task对象 -> IO等待)
示例1:
import asyncio
async def func():
print('找小黑吃疯狂星期四啊!!')
response = 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('执行协程函数内部代码')
# 遇到IO操作挂起当前协程(任务),等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('执行协程函数内部代码')
# 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。当前协程挂起时,事件循环可以去执行其他协程(任务)
response1 = await others()
print('IO请求结束,结果为:', response1)
response2 = await others()
print('IO请求结束,结果为:', response2)
asyncio.run(func())
await就是等待对象的值得到结果之后再往下走。
在事件循环中添加多个任务。
示例1:
import asyncio
async def func():
print(1)
await asyncio.sleep(2)
print(2)
return '返回值'
async def main():
print('main开始')
# 创建Task对象,将当前执行func函数任务添加到任务循环中
task1 = asyncio.create_task(func())
# 创建Task对象,将当前执行func函数任务添加到任务循环中
task2 = asyncio.create_task(func())
print('main结束')
# 当执行某协程遇到IO操作时,回自动化切换执行其他任务
# 此处的await是等待相对应的协程全部执行完毕并获取结果
ret1 = await task1
ret2 = await task2
print(task1, task2)
if __name__ == '__main__':
asyncio.run(main())
示例2:
import asyncio
async def func():
print(1)
await asyncio.sleep(2)
print(2)
return '返回值'
async def main():
print('main开始')
task_list = [
asyncio.create_task(func(), name='n1'),
asyncio.create_task(func(), name='n2')
]
print('main结束')
done, pending = await asyncio.wait(task_list, timeout=2)
print(done, pending)
asyncio.run(main())
示例3:
import asyncio
async def func():
print(1)
await asyncio.sleep(2)
print(2)
return '返回值'
task_list = [
func(),
func()
]
done, pending = asyncio.run(asyncio.wait(task_list))
print(done