Python如何在异步中运行同步代码_使用loop.run_in_executor处理计算
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在线生成企业名称注册公司名称起名大全。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2505483.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!