Django падает, когда два пользователя одновременно запускают расширение C
Краткое изложение проблемы
Я вызываю свое собственное расширение C для Python в Django, которое отвечает за некоторые длительные вычисления. Расширение работает нормально, и даже пользователь может перемещаться по приложению Django, пока расширение C выполняет свои вычисления, поскольку я реализовал управление глобальной блокировкой интерпретатора (GIL) внутри расширения. Однако, когда другой пользователь пытается выполнить расширение (пока оно работает для первоначального пользователя), Django аварийно завершается (процесс убивается) без какого-либо сообщения об ошибке.
Минимальный воспроизводимый пример
В коде ниже вы можете увидеть представление Django, которое вызывает (через запрос POST) расширение C ftaCalculate
.
import ftaCalculate
from django.views.generic.base import TemplateView
# Computation
class ComputationView(TemplateView):
template_name = 'Generic/computation_page.html'
@staticmethod
def get_results(request):
if request.method == "POST": # When button is pressed
# Long computations
cs_min = ftaCalculate.mcs(N, tree)
else:
cs_min = None
return render(request, ComputationView.template_name, {'cs_min': cs_min})
Django падает, когда два пользователя параллельно запускают функцию ftaCalculate.mcs
. Далее я оставляю главную функцию кода на C. Внутри функции comb
я использую Py_BEGIN_ALLOW_THREADS
и Py_END_ALLOW_THREADS
.
Вопрос
Нормально ли, что такое поведение происходит, или я упускаю что-то, что должно быть реализовано в расширении C?