📖 知识点
asyncio.run () 语法
asyncio.run(协程对象)
要点拆解:
asyncio.run()是 Python3.7 + 推荐的入口,自动创建事件循环,执行协程,执行结束后自动关闭循环。传入的必须是协程对象,不是协程函数本身。
✅
asyncio.run(study_task())函数加括号,得到协程对象❌
asyncio.run(study_task)直接传函数名,报错
整个异步程序,一般只在最外层调用一次 asyncio.run (),作为程序入口。
完整基础示例
import asyncio
async def study_task():
print("开始修炼御气术")
await asyncio.sleep(2)
print("御气修炼完毕")
# 启动协程,运行任务
asyncio.run(study_task())
运行输出
开始修炼御气术
# 等待2秒
御气修炼完毕
💡 流程梳理:async def定义协程函数 → study_task()生成协程对象 → asyncio.run(对象)启动事件循环,执行协程
⚠️ 高频踩坑提醒
await 只能写在 async 函数内部,不能写在 run 外面
asyncio.run () 会阻塞主线程,直到里面的协程全部执行完成
不要在已经运行的事件循环内部再次调用 asyncio.run ()
⚔️ Kata 实战任务
任务需求:
导入 asyncio
定义协程函数
query_task(name, wait),打印{name}开始查询,等待{wait}秒,await asyncio.sleep (wait),打印{name}查询完成使用 asyncio.run () 运行
query_task("数据库查询A", 2)
参考代码
import asyncio
async def query_task(name, wait):
print(f"{name}开始查询,等待{wait}秒")
await asyncio.sleep(wait)
print(f"{name}查询完成")
# 启动协程
asyncio.run(query_task("数据库查询A", 2))
运行输出:
数据库查询A开始查询,等待2秒
# 等待2秒
数据库查询A查询完成
🧠 思考题
如果写成
asyncio.run(query_task)不加括号,运行会报错吗?为什么?asyncio.run 执行期间,主线程是卡住的吗?