为何使用asyncio to_thread的函数未实现异步执行?
问题原因与修复方案
你的代码之所以是同步执行,核心问题出在mainAsyncFunction的循环逻辑里:
val['result'] = await asyncio.create_task(turningMyFunctionAsync(val['val']))
每次调用asyncio.create_task()创建任务后,立刻用await等待这个任务完成,这会强制当前协程暂停,直到该任务执行完毕才会进入下一次循环。相当于你是逐个启动任务,并且等一个做完再做下一个,自然无法实现并发。
修复方法
要实现并发,需要先把所有任务都创建出来,让事件循环调度它们同时运行,最后再统一等待所有任务完成。修改mainAsyncFunction如下:
async def mainAsyncFunction(): # 第一步:批量创建所有任务,不立即等待 task_list = [] for val in myList: # 创建任务并保存,此时任务已经被事件循环调度准备执行 task = asyncio.create_task(turningMyFunctionAsync(val['val'])) # 把字典和对应任务绑定,方便后续赋值结果 task_list.append( (val, task) ) # 第二步:统一等待所有任务完成,并将结果赋值 for val, task in task_list: val['result'] = await task
修改后执行,你会看到所有starting job for valX先打印出来,等待4秒后,所有end of job for valX一起打印,实现了预期的并发效果。
补充说明
asyncio.to_thread()会把你的同步函数mySynchronousFunction放到线程池里执行,不会阻塞asyncio的事件循环。当所有任务都被创建后,事件循环会同时启动这些线程中的函数,从而利用多线程实现同步任务的并发执行,提升整体运行速度。
内容的提问来源于stack exchange,提问作者Odyseus_v4
相关产品推荐
相关产品推荐

