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
相关产品推荐
相关产品推荐

