python - uWSGI调用随机注入Python调用堆栈?
问题描述
我正试图找出一个奇怪的错误(见这里)——基本上我看到了意外的数据库断开连接。为了调查,我在 Django 中的断开代码中添加了一个调用堆栈转储 - 现在我比以往任何时候都更加困惑......
我在调用堆栈中看到的是一个完全出乎意料的调用序列,例如:
...
File "/deployment/v_env/lib/python3.8/site-packages/qrcode/base.py", line 326, in __mod__
for item, other_item in zip(self, other)]
File "/deployment/v_env/lib/python3.8/site-packages/qrcode/base.py", line 303, in __iter__
return iter(self.num)
File "/deployment/v_env/lib/python3.8/site-packages/django/http/response.py", line 292, in close
signals.request_finished.send(sender=self._handler_class)
File "/deployment/v_env/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 180, in send
return [
...
这里我正在使用的二维码库突然跳转到 HttpResponse.close()。其他:
...
File "/deployment/v_env/lib/python3.8/site-packages/django/db/models/query.py", line 1268, in _insert
query = sql.InsertQuery(self.model, ignore_conflicts=ignore_conflicts)
File "/deployment/v_env/lib/python3.8/site-packages/django/db/models/sql/subqueries.py", line 141, in __init__
super().__init__(*args, **kwargs)
File "/deployment/v_env/lib/python3.8/site-packages/django/http/response.py", line 292, in close
signals.request_finished.send(sender=self._handler_class)
File "/deployment/v_env/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 180, in send
return [
...
这里一些 Django DB 查询代码突然跳转到 HttpResponse.close()。
这个调用堆栈不可能是正确的 - 紧接在 close() 上方的代码根本不会调用该代码,也不会调用可能以某种方式绑定到错误对象的 close() 方法。
现在 HttpResponse.close()可以由 uWSGI 从 C 运行时调用- 我唯一能想到的是这是在处理请求期间发生的,并且不知何故这会出现在调用堆栈中。
所以我的问题是,真的是这样吗?对 python 的 C 调用真的只是像这样跳入调用堆栈,还是 uWSGI 未能正确保护对 Python 的调用?我知道必须在调用 python 之前获取 GIL - 也许这不会发生。或者可能traceback.print_stack()
没有正确处理来自 C 的调用?
任何见解都很好。
解决方案
再想一想,我认为这种注入调用堆栈是正确的。它还能如何工作?GIL 可以随时获得,Python 不会在每次调用时启动一个新的解释器,所以它必须在当前上下文中运行。
推荐阅读
- python - MatplotLib 图表 -> ConversionError:无法将值转换为轴单位
- microservices - sagas 在微服务架构中的位置在哪里?
- python-3.x - 一起使用 Numba 和 Cython 是否明智?
- c# - 双击文件后将文件路径传递给应用程序
- ios - 如何显示数组json数组中的图像
- spring - 春天兔子MQ。连接多个应用实例时确定所有消费者
- angular - 表没有获得价值,因为价值未定义
- javascript - 使用 Promise.allSettled 对 JSON API 进行压力测试。为什么后续请求的拒绝会增加?
- r - 仅来自两个类别的 pivot_wider
- html - 是否有解决方法允许 contenteditable 属性在 Firefox 中的行为与在 Chrome 和 Edge 中的行为相同?