Django: асинхронная разработка сервисов с помощью обмена списками задач

Я создаю веб-приложение с помощью Django 3.1.0 и Python 3.8. Это приложение требует выполнения очень длинной операции бэк-офиса, для которой мне интересно знать процент выполнения. Для этого сервер предоставляет два сервиса:

  • www.contoso.com/process_start: возвращает строку, обозначающую id, присвоенный задаче;
  • www.contoso.com/process_status/taskid: возвращает число от 0 до 1 для обозначения прогресса (в качестве taskid я использую id, возвращаемый вызовом process_start);

Для этого я создал следующий класс Python

TASKS = dict() # list of tasks in progress

class Task():

    def __init__(self):
        id = get_uid() # generation of a random string
        TASKS[id] = self # added to the list of tasks in progress

        self.id = id
        self.percentage = 0.0
        self.thread = Thread(name=self.id, target=self.execute)
        self.thread.start()

    @staticmethod
    def get_status(id: str) -> float:
        task = TASKS.get(id, None)
        return (1.0 if task == None else task.percentage)
        
    def execute(self) -> None:
        try:
            ...
        
        finally:
            TASKS.pop(self.id, None) # removal from the list of tasks in progress

Первая служба создает задачу следующим образом:

    def post(self, request: Request) -> Response:
        task = TaskReslice()
        return Response(status=status.HTTP_200_OK, data=task.id)

вторая служба возвращает статус задания таким образом:

    def get(self, request: Request, *args, **kwargs) -> Response:
        task_id: str = kwargs["id"]
        return Response(status=status.HTTP_200_OK, data=Task.get_status(task_id))

Проблема в том, что вторая служба не может найти ни одной запущенной задачи. В чем проблема?

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