You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中能否不使用阻塞的await启动协程实现非阻塞执行?

解决Python协程非阻塞启动的方案

核心实现方法

你需要的非阻塞启动协程的需求可以通过asyncio.create_task()实现,这个API会将协程封装成Task对象提交到当前事件循环调度,调用后立刻返回,不会阻塞当前代码向下执行。
修正后的可运行代码如下:

import asyncio

async def washing():
    await asyncio.sleep(3)
    print("All washed!")

async def myloop():
    while 1:
        # 非阻塞启动washing协程,立刻返回不等待执行完成
        asyncio.create_task(washing())
        print("start washing...")
        await asyncio.sleep(5)

asyncio.run(myloop())

上述代码执行逻辑符合预期:每次循环会先启动washing后台任务,立刻打印start washing...,3秒后后台任务执行完成输出All washed!,两个协程为并行运行状态。

注意事项

  • 任务生命周期绑定事件循环:如果主协程提前退出,所有未执行完成的Task会被自动取消。如果你需要等待所有后台任务完成再退出主程序,可以把create_task返回的Task对象存入列表,最后统一用await asyncio.gather(*task_list)等待执行完成。
  • 异常处理:默认后台Task执行时抛出的异常如果没有被捕获,只会在Task被回收时打印错误日志,如果你需要处理异常,可以给Task添加回调,或者在协程内部做异常捕获。
  • Python 3.7以下版本兼容:如果使用的是3.7以下的Python版本,没有asyncio.create_task接口,可以替换为asyncio.ensure_future(washing()),效果完全一致。

内容的提问来源于stack exchange,提问作者George Y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 12:12:01