【发布时间】: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