行者孙Python

御气篇-Day82 asyncio.create_task 创建异步任务

📖 知识点

asyncio.create_task () 语法

 

任务对象 = asyncio.create_task(协程对象)

 

要点拆解:

  1. create_task作用:将协程包装成Task 任务,立刻加入事件循环排队调度。

  2. 创建任务之后,主协程可以继续往下执行,不需要等这个任务结束。

  3. 想要拿到任务结果,用 await 任务对象,等待任务执行完成。

  4. ⚠️ 必须在已经运行的协程内部调用 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())

 

💡 执行流程:

  1. 进入 main 协程

  2. create_task 把 work 包装成任务,进入调度队列

  3. 代码继续往下执行,不会原地卡住

  4. 遇到await task1,主协程暂停,等待 task1 完成

⚠️ 易错提醒

  • create_task 接收的是协程对象:work("A",2)(带括号)

  • Task 创建之后,会自动运行,只要事件循环有空就会调度

  • 不要忘记 await 任务,如果主协程提前结束,未完成任务会被直接取消

⚔️ Kata 实战任务

任务需求:

  1. 导入 asyncio

  2. 编写协程函数 query(name, wait):打印{name}开始查询,await asyncio.sleep (wait),打印{name}查询结束

  3. 编写 main 协程:

    • 使用 create_task 创建 task1,执行query("查询1",2)

    • 打印提示文字:任务已提交,继续等待

    • await task1 等待任务结束

  4. 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查询结束

 

🧠 思考题

  1. 如果创建 task1 之后,不写 await task1,main 直接结束,会发生什么?

  2. create_task 必须写在 async 函数内部吗?放到普通 def 里面调用会报错吗?

‹ 返回目录
🏠首页 Python 📦资源 👤关于我