0

0

Python协程里的同步代码阻塞_异步函数中调用耗时同步函数导致整个事件循环卡死解决

P粉602998670

P粉602998670

发布时间:2026-03-12 17:19:02

|

495人浏览过

|

来源于php中文网

原创

async函数中禁用time.sleep()等同步阻塞调用,须改用await asyncio.sleep();同步I/O(如requests、json.loads)需替换为异步版本或通过run_in_executor谨慎处理,否则会卡死事件循环。

python协程里的同步代码阻塞_异步函数中调用耗时同步函数导致整个事件循环卡死解决

async 函数里直接调用 time.sleep() 会卡死事件循环

协程不是线程,time.sleep() 是同步阻塞调用,它会让当前线程停住——而 asyncio 的事件循环就跑在这个线程上。一旦卡住,所有待调度的 await 任务都得干等。

常见错误现象:asyncio.run(main()) 启动后,程序看起来“假死”,其他协程完全不执行,CPU 占用低,日志停在某次 time.sleep(5) 上。

  • 别用 time.sleep(),改用 await asyncio.sleep(5)
  • 如果只是模拟延迟,asyncio.sleep() 是唯一正解;它会把控制权交还给事件循环,让别的协程继续跑
  • 注意参数单位一致:两者都是秒,但 asyncio.sleep() 支持 float(比如 0.1),且不会因系统精度抖动

第三方同步库(如 requests、json.load)不能直接 await

requests.get()open().read()sqlite3.connect() 这些全是同步阻塞 I/O,它们内部会一直占着线程不放,导致事件循环无法切换任务。

使用场景:你想在异步 Web 服务(如 FastAPI、aiohttp)里调一个 HTTP 接口,或读一个大配置文件。

立即学习Python免费学习笔记(深入)”;

  • HTTP 请求优先换用 aiohttphttpx.AsyncClient,它们是真正异步的
  • 文件读写可用 await aiofiles.open(...).read()(需装 aiofiles
  • 数据库操作必须用异步驱动:比如 aiosqliteasyncpg,而不是 sqlite3psycopg2
  • 实在没异步版?只能用 loop.run_in_executor() 把同步调用扔进线程池——但这是兜底方案,别当默认写法

run_in_executor 不是万能解药,用错反而更慢

把同步函数丢进线程池,确实能避免卡死事件循环,但线程创建、上下文切换、GIL 争抢全都在后台发生。高频调用时,开一堆线程比纯同步还慢。

Sora
Sora

Sora是OpenAI发布的一种文生视频AI大模型,可以根据文本指令创建现实和富有想象力的场景。

下载

性能影响:默认 ThreadPoolExecutor 最大线程数是 CPU 核心数 × 5,如果并发请求 100 个,每个都 run_in_executor 调一次 requests.get(),实际可能起 50+ 线程,内存和调度开销陡增。

  • 只对「无法替代的同步黑盒」用,比如调用某个闭源 SDK 或遗留 C 扩展
  • 显式传入复用的 ThreadPoolExecutor 实例,避免反复创建销毁线程池
  • 别在循环里反复 await loop.run_in_executor(None, sync_func, x);先批量收集参数,再一次性提交
  • 注意异常传播:线程里抛的异常会包装成 concurrent.futures.CancelledError 或原样抛出,但堆栈可能不完整

async def 里混用同步逻辑,debug 时容易漏掉隐性阻塞点

最麻烦的不是明面上的 time.sleep(),而是那些看起来“无害”的同步操作:比如遍历超大列表做复杂计算、用正则反复 match、或者调用某个看似轻量实则内部做磁盘扫描的函数。

容易踩的坑:本地测试数据小,一切正常;一上生产,用户上传 10MB JSON,json.loads() 在主线程里解析 300ms,整个事件循环就卡了 300ms。

  • sys.settrace()asyncio.debug=True 启动时加 -d 参数,可捕获“长时间未让出控制权”的协程
  • 对 CPU 密集型操作(如加密、图像处理),必须用 loop.run_in_executor(None, cpu_bound_func),且考虑是否该移到专用进程(ProcessPoolExecutor
  • 检查依赖库文档,确认其 async 版本是否存在;很多库(如 pydantic)v2 起已原生支持异步序列化

真正的难点不在“怎么写 async”,而在识别哪些调用表面安静、实则暗中锁死事件循环——尤其当它藏在三层封装之后。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

456

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

28

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

251

2026.02.06

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

595

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

106

2025.10.23

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号