Вызов 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 [
...

Здесь библиотека QR-кодов, которую я использую, внезапно перескакивает на 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 внезапно перескакивает на HttpResponse.close().

Не может быть, чтобы этот стек вызовов был правильным - код непосредственно над close() просто не вызывает этот код, как и метод close(), который может быть каким-то образом привязан к неправильному объекту.

Теперь HttpResponse.close() может быть вызван uWSGI из среды выполнения C - единственное, что я могу понять, это то, что это происходит во время обработки запроса, и каким-то образом это отображается в стеке вызовов

Итак, мой вопрос в том, действительно ли это так? Действительно ли вызов C в python просто проскакивает в стеке вызовов таким образом, или uWSGI не может защитить вызов Python правильно? Я понимаю, что GIL должен быть получен перед любым вызовом python - возможно, этого не происходит. Или, может быть, traceback.print_stack() не обрабатывает вызовы из C должным образом?

Любая проницательность приветствуется.

Подумав еще немного, я думаю, что эта инъекция в стек вызовов верна. Как еще это может работать? GIL может быть получен в любое время, а Python не собирается запускать новый интерпретатор при каждом вызове, поэтому он должен просто работать в текущем контексте.

Вернуться на верх