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?

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