1

在过去的几个小时里,这一直困扰着我,我似乎还找不到解决方案。

我正在使用 django-rq 将一些长时间运行的任务排入队列。在我的tasks.py中,我有以下内容:

from django_rq import job
@job
def long_running_task(hash, url, file_path):

     #doing some work

在我的views.py,

def post(self, request, hash, file_path, format=None):
    URL = "http://127.0.0.1:9000/work/"
    task = django_rq.enqueue(long_running_task, hash, URL, file_path)
    print("job result is: ", task.result)
    return JsonResponse({"task_result": task.result})

但是,当我运行它时,它会失败并显示以下消息-

TypeError: long_running_task() takes 2 positional arguments but 3 were given

显然,我在这里做了一些愚蠢的事情,但我还无法弄清楚。有人可以让我知道这里发生了什么吗?

4

2 回答 2

0

当你移除装饰器时会发生什么?

AFAIU,入队只接受一个函数及其参数并返回一个工作。装饰器将函数声明为作业。您需要使用其中一种。

要使用装饰器,您需要执行以下伪操作:

def post(self, request, hash, file_path, format=None):
    URL = "http://127.0.0.1:9000/work/"
    task = long_running_task.delay(hash, URL, file_path)
    # wait some time for completion
    print("job result is: ", task.result)
    return JsonResponse({"task_result": task.result})
于 2017-08-26T11:05:44.053 回答
0

奇怪的是,这似乎是一个循环依赖类型的问题。以前,我的tasks.py文件(我在其中定义了long_running_task)比我的文件高一级views.py。我将tasks.py文件移动到同一级别,它开始正常工作。不知道为什么会抛出看似无关的错误。

于 2017-08-30T20:58:14.827 回答