如何修复Python asyncio链式协程执行报错问题?
问题修复方案
错误原因
你直接将download_dummy(task)的返回值(一个协程对象)传给了process_data,而非等待download_dummy执行完成后拿到的实际数据。process_data试图对协程对象执行乘法操作,因此抛出TypeError。
修复代码
把“下载→处理”的链式逻辑封装成独立协程,让每个任务内部先完成下载,再处理数据,同时通过TaskGroup并行执行所有链式任务:
import asyncio import time task_inputs = [0,1,2,3,4,5,4,3,4] async def download_dummy(url): await asyncio.sleep(url) data = url print(f'downloaded {url}') return data async def process_data(data): await asyncio.sleep(1) processed_data = data*2 print(f"processed {data}") return processed_data # 封装下载+处理的链式逻辑 async def download_and_process(task): data = await download_dummy(task) return await process_data(data) async def main(task_inputs): task_handlers = [] print(f"started at {time.strftime('%X')}") async with asyncio.TaskGroup() as tg: for task in task_inputs: # 创建链式任务 res = tg.create_task(download_and_process(task)) task_handlers.append(res) print(f"finished at {time.strftime('%X')}") results = [task_handler.result() for task_handler in task_handlers] print(results) asyncio.run(main(task_inputs))
执行逻辑说明
- 每个
download_and_process协程内部会先等待download_dummy完成,拿到返回的data后,再传入process_data执行处理。 TaskGroup会同时启动所有download_and_process任务,保证整体并发执行效率,同时每个任务内部按顺序完成下载和处理。
内容的提问来源于stack exchange,提问作者Tue
相关产品推荐
相关产品推荐

