21

我正在使用 django-rq 来处理我的 django 站点上的一些长时间运行的任务。这些任务触发(我假设)rqworker 的 180 秒超时:

JobTimeoutException: Job exceeded maximum timeout value (180 seconds).

如何增加此超时值?我尝试将 --timeout 360 添加到 rqworker 命令,但这无法识别。

在我的 python 代码中,我的长期工作是通过调用

        django_rq.enqueue(
            populate_trends,
            self,
        )

并尝试过

        django_rq.enqueue_call(
            func=populate_trends,
            args=(self,),
            timeout=3600,
        )

我在rq 文档中注意到但 django-rq 似乎没有这样的方法。

更新

现在我分叉了 django-rq 并添加了一个占位符修复来增加超时。可能需要与项目合作以获得更长期的解决方案。我已经开始在那里讨论一个问题。

4

4 回答 4

29

这似乎是解决问题的正确方法。

queue = django_rq.get_queue('default')
queue.enqueue(populate_trends, args=(self,), timeout=500) 

如果你需要通过 kwargs,

queue = django_rq.get_queue('default')
queue.enqueue(populate_trends, args=(self,), kwargs={'x': 1,}, timeout=500) 

感谢 django-rq 项目的 selwin 提供的帮助。

于 2013-03-16T06:03:09.173 回答
9

更新:您可以将 timeout 参数作为关键字参数传递给 django-rq 的 @job 装饰器。请注意,您必须首先传递队列名称参数。

@job("default", timeout=600)
def long_running_task():
    ...
于 2016-06-15T10:28:59.443 回答
2

使用job_timeout

queue.enqueue(worker_func, *args, **kwargs, job_timeout=200)

正如斯蒂芬布莱尔所指出的,该timeout参数不适用于较新版本的 rq:

timeouton 的论点queue.enqueue()已被弃用,取而代之的是job_timeout.

https://github.com/rq/rq/blob/master/CHANGES.md#10-2019-04-06

哪里job_timeout的效果和以前一样timeout

于 2020-09-04T12:55:21.013 回答
1

为了让人们清楚地使用带参数的函数,您可以按如下方式传递超时

 string_to_print = "Hello World"

 queue = django_rq.get_queue('default')
 queue.enqueue(print_input, to_print=string_to_print, timeout=600)      

对于采用如下参数的函数

 @job
 def print_input(to_print):
     print "The input supplied is ", to_print
于 2016-12-02T06:43:17.753 回答