📖 知识点
asyncio.create_task () 语法
任务对象 = asyncio.create_task(协程对象)
要点拆解:
create_task作用:将协程包装成Task 任务,立刻加入事件循环排队调度。创建任务之后,主协程可以继续往下执行,不需要等这个任务结束。
想要拿到任务结果,用
await 任务对象,等待任务执行完成。⚠️ 必须在已经运行的协程内部调用 create_task,不能在普通函数直接使用。
基础示例
import asyncio
async def work(name, delay):
print(f"{name} 分身开始执行,等待{delay}秒")
await asyncio.sleep(delay)
print(f"{name} 分身任务完成")
async def main():
# 创建任务,提交给事件循环
task1 = asyncio.create_task(work("任务A", 2))
print("主协程:已经提交任务A,继续做别的事情")
# 等待任务执行结束
await task1
asyncio.run(main())
💡 执行流程:
进入 main 协程
create_task 把 work 包装成任务,进入调度队列
代码继续往下执行,不会原地卡住
遇到
await task1,主协程暂停,等待 task1 完成
⚠️ 易错提醒
create_task 接收的是协程对象:
work("A",2)(带括号)Task 创建之后,会自动运行,只要事件循环有空就会调度
不要忘记 await 任务,如果主协程提前结束,未完成任务会被直接取消
⚔️ Kata 实战任务
任务需求:
导入 asyncio
编写协程函数
query(name, wait):打印{name}开始查询,await asyncio.sleep (wait),打印{name}查询结束编写 main 协程:
使用 create_task 创建 task1,执行
query("查询1",2)打印提示文字:任务已提交,继续等待
await task1 等待任务结束
asyncio.run () 运行 main
参考代码
import asyncio
async def query(name, wait):
print(f"{name}开始查询")
await asyncio.sleep(wait)
print(f"{name}查询结束")
async def main():
# 创建异步任务
task1 = asyncio.create_task(query("查询1", 2))
print("主程序:任务已经提交到事件循环,等待任务完成")
# 等待任务执行完毕
await task1
asyncio.run(main())
运行输出
主程序:任务已经提交到事件循环,等待任务完成
查询1开始查询
# 等待2秒
查询1查询结束
🧠 思考题
如果创建 task1 之后,不写 await task1,main 直接结束,会发生什么?
create_task 必须写在 async 函数内部吗?放到普通 def 里面调用会报错吗?
行者孙Python