【问题标题】:How to get Django-Q to send a message once the broker has finished executing a task?代理完成任务执行后,如何让 Django-Q 发送消息?
【发布时间】:2020-07-30 18:34:34
【问题描述】:

我有一个 django 应用程序,它需要向后端发送一些大任务以异步执行。为此,我正在使用 django-q 和 redis。

它在基本层面上工作 - 任务被发送到 redis,django 不再被阻塞等待 - 但它默默地做。该应用程序不知道任务何时完成,或者它是否已成功完成。这使它非常脆弱。我现在正在尝试在任务完成(成功与否)时从 redis 获取信号。

查看 DjangoQ documentation,我设置了以下概念证明:

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 然后点击 url 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),但结果相同。

【问题讨论】:

  • 你没有从你的函数中返回任何东西,为什么你会期望得到除了 None 之外的任何东西
  • 是的。既然您指出了,那是一个非常明显的解决方法!谢谢

标签: django asynchronous redis


【解决方案1】:

很明显,您的任务在打印出文本时已经运行,您的钩子也在任务完成后运行

你得到结果 None 因为你没有从你的方法返回任何结果

示例:

def sleep_and_print(secs):
    sleep(secs)
    print("task done")
    return True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多