asyncio.ensure_future与create_task的区别及适用场景解析
asyncio.ensure_future 与 create_task 的使用场景及区别
核心差异与适用场景
- asyncio.create_task():Python 3.7起新增的官方推荐API,语义明确,专门用来创建Task。它仅接受可等待对象(比如async定义的协程),会自动将协程包装成Task并加入当前事件循环调度。
- 适用时机:当你明确要把协程转为后台并发任务,且运行环境是Python 3.7及以上版本时,优先用它。
- asyncio.ensure_future():兼容性更强的老API(支持Python 3.4+),功能更宽泛——它不仅能处理协程,还能直接返回传入的Future或Task对象:
- 若传入协程,会自动包装为Task;
- 若传入的已经是Future/Task,直接返回原对象。
- 适用时机:需要处理协程、Future、Task混合类型的对象,或者要兼容Python 3.7之前的版本时,才考虑使用。
代码示例
使用 asyncio.ensure_future 的实现
async def run(r): url = "http://localhost:8080/{}" tasks = [] # 在同一个Client会话中获取所有响应,保持连接复用 async with ClientSession() as session: for i in range(r): task = asyncio.ensure_future(fetch(url.format(i), session)) tasks.append(task) responses = await asyncio.gather(*tasks) # 所有响应体都存储在这个变量中 print(responses)
使用 asyncio.create_task 的实现
async def get_all(*names: str): started_at = time.time() # 创建任务,同时发起所有请求以实现并发 tasks = [asyncio.create_task(get_pokemon(name)) for name in names] # 等待所有任务执行完成 results = await asyncio.gather(*tasks) for result in results: if result: pokemon = parse_pokemon(result) print(f"💁 {pokemon.name} 的属性为 {','.join(pokemon.types)}") else: print(f"❌ 未找到对应数据...")
内容的提问来源于stack exchange,提问作者SonyMag
相关产品推荐
相关产品推荐

