rqworker超时

23 投票
4 回答
14594 浏览
提问于 2025-04-17 19:17

我在我的django网站上使用django-rq来处理一些需要很长时间才能完成的任务。这些任务会触发(我想是)rqworker的180秒超时限制。

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

我该如何增加这个超时值呢?我尝试在rqworker命令中添加--timeout 360,但这个命令没有被识别。

在我的python代码中,我的长时间运行的任务是通过

        django_rq.enqueue(
            populate_trends,
            self,
        )

来调用的,我还尝试过

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

这个方法我在rq文档中看到过,但似乎django-rq没有这样的功能。

更新

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

4 个回答

3

使用 job_timeout

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

正如 Stephen Blair 所指出的,timeout 这个参数在新版本的 rq 中已经不再有效:

queue.enqueue() 中的 timeout 参数已经被弃用,取而代之的是 job_timeout

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

job_timeout 的作用和之前的 timeout 是一样的。

9

更新一下:你可以把超时时间作为关键字参数传递给django-rq的@job装饰器。注意,你需要先传递队列名称这个参数。

@job("default", timeout=600)
def long_running_task():
    ...
31

这看起来是解决这个问题的正确方法。

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

如果你需要传递关键字参数,

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

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

撰写回答