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))
Проблема в том, что вторая служба не может найти ни одной запущенной задачи. В чем проблема?