资讯动态

Python如何在异步中运行同步代码_使用loop.run_in_executor处理计算

发布时间:2026/9/22 21:43:15 来源:尧图企业网站定制
async函数中不可直接调用同步CPU密集型代码因其会阻塞事件循环导致异步失效应使用run_in_executor配合线程池或进程池执行注意参数传递、异常处理与资源清理。为什么不能直接在 async 函数里调用同步 CPU 密集型代码因为 async 函数运行在事件循环的同一线程中一旦执行耗时的同步计算比如 time.sleep(5)、json.loads() 大字符串、数值运算整个协程就卡住其他任务无法调度 —— 事件循环被阻塞了异步就失效了。常见错误现象asyncio.sleep() 能挂起但 time.sleep() 会让整个服务响应变慢用 requests.get() 发请求后所有并发请求串行执行日志里没报错但吞吐量掉到单线程水平。不是所有同步代码都必须进线程池小量字符串处理、字典操作、简单条件判断开销远小于调度成本直接写就行CPU 密集型如加密、压缩、科学计算必须进 run_in_executorIO 密集型但没异步接口的库如旧版 requests也得走 run_in_executor否则照样阻塞循环怎么用 loop.run_in_executor 正确包裹同步函数核心是把同步函数作为参数传进去别加括号调用返回的是 asyncio.Future要 await 才能得到结果。示例对一个大列表做 CPU 密集排序立即学习“Python免费学习笔记深入”import asyncioimport timepdef cpu_heavy_sort(data):time.sleep(0.1) # 模拟耗时计算return sorted(data, reverseTrue)/ppasync def main():loop asyncio.get_running_loop()data list(range(10000))/ph1? 正确传函数对象 参数不调用/h1pre classbrush:php;toolbar:false;result await loop.run_in_executor(None, cpu_heavy_sort, data)print(len(result)) NameGPT名称生成器 免费AI公司名称生成器AI在线生成企业名称注册公司名称起名大全。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价