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

为何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:37:18