asyncio
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)
写入自己的博客中才能记得长久
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!