У меня есть приложение django, которое должно отправить некоторые большие задачи в бэкэнд для асинхронного выполнения. Для этого я использую django -q с redis.
Работает на базовом c уровне - задача отправляется на redis, django больше не блокируется в ожидании - но делает это молча. Приложение не знает, когда задание выполнено или успешно выполнено. Это делает его действительно ломким. Сейчас я пытаюсь получить сигнал от Redis, когда задача выполнена (успешно или нет).
Глядя на документацию DjangoQ , я установил следующее доказательство концепция:
views.py
import json
from django.http import JsonResponse
from django_q_tasks import async_task
def testredisview(request):
json_payload = {"message": "hello world!"}
async_task("services.sleep_and_print", 10, hook='hooks.print_result')
return JsonResponse(json_payload)
services.py
from time import sleep
def sleep_and_print(secs):
sleep(secs)
print("task done")
hooks.py
def print_result(task):
print((task.id, task.result))
Когда я запускаю python3 manage.py qcluster
, а затем нажимаю на ссылку 127.0.0.1:8000/testredis
, через 10 секунд я получаю JSON: message: "hello world!"
и сервер django показывает: [Q] INFO Enqueued 1
, поэтому он успешно выполняет сервисную команду.
Однако кластер показывает:
[Q] INFO Q Cluster -cluster_name- running.
[Q] INFO Process-1:1 processing [-process_name-]
'task done'
'(-task_id-, None)'
[Q] INFO Processed [-process_name-]
В документации указано, что task.result = None
означает, что задача не была выполнена, и что hook
вызывается после того, как задача была выполнена, поэтому я ожидал, что будет возвращен объект результата, вместо None
Я пытался установить синхронность (Q_CLUSTER['sync']=True
), но у меня были те же результаты .