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

Python 3.5中asyncio异步程序启动函数调用问题求助

解决Python 3.5中asyncio异步任务的启动问题

嘿,从Node.js转Python异步确实会有一些小门槛,尤其是启动异步任务这块——毕竟Node.js会自动帮你打理事件循环,而Python得咱们手动“启动”它才行!结合你用的Python 3.5版本(注意asyncio.run()是3.7才新增的,所以3.5得用老方法),我给你理清楚正确的启动姿势:

先补全你的简化示例代码

首先咱们把你提到的get_data协程补成可运行的完整示例:

import asyncio

async def get_data():
    # 用asyncio.sleep模拟实际的异步IO操作(比如请求API、读文件)
    foo = await asyncio.sleep(2)
    return {"data": "异步获取到的内容"}

# 推荐把异步逻辑都放到顶层的main协程里,方便管理
async def main():
    result = await get_data()
    print("拿到结果啦:", result)

正确启动异步任务的两种方式

方式1:运行单个协程

Python 3.5里需要手动获取事件循环,然后让它运行直到目标协程完成:

if __name__ == "__main__":
    # 获取默认的事件循环
    loop = asyncio.get_event_loop()
    try:
        # 让循环运行直到main协程执行完毕
        loop.run_until_complete(main())
    finally:
        # 任务结束后关闭循环,避免资源泄漏
        loop.close()

你可以把这段代码理解成Node.js里的async function main() { ... }; main().catch(...)——相当于手动触发整个异步流程的启动。

方式2:同时运行多个异步任务

如果你的代码库有多个异步任务需要并行执行,可以用asyncio.gather()把它们打包,再交给事件循环:

# 新增一个异步任务示例
async def another_async_task():
    await asyncio.sleep(1)
    return {"other_data": "另一个异步任务的结果"}

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    # 把多个协程打包成一个可等待对象
    tasks = asyncio.gather(get_data(), another_async_task())
    try:
        # 运行直到所有任务完成,会返回所有任务的结果列表
        all_results = loop.run_until_complete(tasks)
        print("所有任务结果:", all_results)
    finally:
        loop.close()

跟Node.js异步的小区别提醒

  • Node.js里调用async函数会直接返回Promise并进入事件队列,但Python里直接调用get_data()只会得到一个协程对象,不会真正执行——必须把它交给事件循环来调度。
  • 你之前写的其他异步逻辑(比如在协程里用await调用其他异步函数)是没问题的,跟Node.js里的await用法一致,核心差异就在顶层任务的启动上。

内容的提问来源于stack exchange,提问作者Riley Hughes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:35:18