rq Параметр тайм-аута в вызове очереди не работает, что дает JobTimeoutException

Я пытаюсь изменить тайм-аут на работу RQ, но, похоже, ничего не работает. У меня есть кое-что с эффектом:

my_queue = Queue('my_task', connection=Redis())

job_args = (1, 2, 4)

my_queue.enqueue_call(
                    my_func,
                    args=job_args,
                    timeout=2700
            )

но я все еще получаю

JobTimeoutException: Job exceeded maximum timeout value (180 seconds)

Я так отчаялся, что даже попытался зайти в rq-модуль queue.py и изменить аргумент по умолчанию для тайм-аута на 2700 и DEFAULT_TIMEOUT (переменная, определенная в классе Queue, который содержит метод enqueue_call). Я что-то упустил или есть проблема с этим кто-нибудь знает? Спасибо!

2 ответа

Мы можем решить эту проблему, установив время ожидания при инициализации очереди.

from rq import Worker, Queue, Connection
q = Queue(default_timeout=3600)

Надеюсь, что это решит ваш запрос.

Использовать

my_queue = Queue('my_task', connection=Redis())
job_args = [1, 2, 4]

my_queue.enqueue_call(
                f=my_func,
                job_timeout=2700,
                args=job_args
        )

timeout - неправильное имя параметра. Проверьте функцию parse_args для всех остальных имен параметров в queue.py

В enqueue_call нет проблем с аргументом тайм-аута. Только что проверил это на этом примере.

function.py

from time import sleep
def test(a, b, c):
    sleep(a)
    print str(b+c)

driver.py

from redis import Redis
from rq import Queue
from function import test

q = Queue('abc', connection=Redis())

q.enqueue_call(test, args=(300, 2, 3), timeout=200)
q.enqueue_call(test, args=(100, 2, 3), timeout=200)

Результат:

13:08:11 abc: test.test(100, 2, 3) (4b4e96e5-af30-4175-ab94-ceaf9187e581)
5
13:08:13 abc: test.test(300, 2, 3) (04605c34-d039-42ad-954e-7f445f0f8bc9)
13:11:17 JobTimeoutException: Job exceeded maximum timeout value (200 seconds)
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/rq/worker.py", line 568, in perform_job
    rv = job.perform()
  File "/usr/local/lib/python2.7/dist-packages/rq/job.py", line 495, in perform
    self._result = self.func(*self.args, **self.kwargs)
  File "./test.py", line 4, in test
    sleep(a)
  File "/usr/local/lib/python2.7/dist-packages/rq/timeouts.py", line 51, in handle_death_penalty
    'value ({0} seconds)'.format(self._timeout))
JobTimeoutException: Job exceeded maximum timeout value (200 seconds)
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/rq/worker.py", line 568, in perform_job
    rv = job.perform()
  File "/usr/local/lib/python2.7/dist-packages/rq/job.py", line 495, in perform
    self._result = self.func(*self.args, **self.kwargs)
  File "./test.py", line 4, in test
    sleep(a)
  File "/usr/local/lib/python2.7/dist-packages/rq/timeouts.py", line 51, in handle_death_penalty
    'value ({0} seconds)'.format(self._timeout))
JobTimeoutException: Job exceeded maximum timeout value (200 seconds)

Если вы используете такие инструменты, как supervisor, для управления рабочими RQ, попробуйте перезапустить службу.

Другие вопросы по тегам