Как заставить Django -Q отправлять сообщение, когда брокер завершил выполнение задачи? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть приложение 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), но у меня были те же результаты .

1 Ответ

1 голос
/ 17 апреля 2020

Очевидно, что ваша задача была выполнена, поскольку она печатает текст, а также ваша ловушка запускается после того, как задача завершена

Вы получаете результат Нет, поскольку вы не возвращаете никакого результата из вашего метода

пример:

def sleep_and_print(secs):
    sleep(secs)
    print("task done")
    return True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...