同一服务器调用Django REST Framework接口报JSONDecodeError问题咨询
问题根因
你的猜测完全正确,本质是单worker单线程下的请求死锁:
- 默认情况下gunicorn使用同步(sync)worker模式,你没有指定
--threads参数时,每个worker只有1个工作线程,同一时间只能处理1个HTTP请求。 - 你的业务逻辑是:某个请求进入服务触发视图执行后,会在代码里通过公网域名再次调用自身服务的另一个API端点。此时唯一的工作线程已经被第一个请求占用,新发起的API调用请求没有空闲线程可以处理,只能排队等待,直到超时返回500错误,响应体为空或者是服务错误页,完全不符合JSON格式,才会抛出
JSONDecodeError。
参数调整生效的原理
你新增的--threads 2参数给同步worker配置了2个工作线程,此时服务可以同时处理2个请求:第一个请求占用1个线程发起内部API调用,第二个空闲线程可以处理这个内部调用请求,流程就能正常跑通,返回合法JSON就不会报错了。
优化建议
- 尽量不要在服务内部通过HTTP请求调用自身接口,直接复用对应的业务逻辑代码/直接调用视图函数即可,既不会出现死锁问题,也能减少不必要的HTTP开销,性能提升明显。
- 后续遇到类似JSON解析报错,可以先打印
response.status_code和response.text查看返回的实际内容,能快速定位根因。 - 生产环境建议根据服务器CPU核数调整worker数量,通用公式是
worker数 = CPU核心数 * 2 + 1,配合合理的线程数配置,避免高流量下的阻塞问题。
内容的提问来源于stack exchange,提问作者hello
相关产品推荐
相关产品推荐

