python и сельдерей: переопределить жесткие тайм-ауты для использования с пулом Gevent - PullRequest
0 голосов
/ 21 января 2020

Есть ли способ преодоления жестких таймаутов в сельдерее? Я знаю, что могу сделать это с помощью наследования задач для неудачных заданий.

class MyTask(Task):
def on_failure(self, exc, task_id, args, kwargs, einfo):
    print('{0!r} failed: {1!r}'.format(task_id, exc))

@app.task(base=MyTask, soft_time_limit=5, time_limit=10)
def add(x, y):
    raise KeyError()

Но жесткий тайм-аут не является неудачной работой. Причина, по которой я хочу это сделать, заключается в том, что мягкие тайм-ауты не работают с пулом Gevent, а только жесткие тайм-ауты.

1 Ответ

0 голосов
/ 23 января 2020

Мне понадобилось немного времени, чтобы понять, но вот как ты это делаешь. наследовать от запроса, а затем наследовать от задачи. Вызов запроса (где находится метод on_failure) из MyTask.

class MyRequest(Request):
    def on_timeout(self, soft, timeout):
        super(MyRequest, self).on_timeout(soft, timeout)
        if not soft:
           logger.warning(
               'A hard timeout was enforced for task %s',
               self.task.name
           )


class MyTask(Task):
    Request = MyRequest  # you can use a FQN 'my.package:MyRequest'

    def on_failure(self, exc, task_id, args, kwargs, einfo):
        print('{0!r} failed: {1!r}'.format(task_id, exc))


def run_time_job():
    a = random.randrange(0, 20)
    print('sleeping for', a)
    time.sleep(a)


@app.task(base=MyTask, soft_time_limit=5, time_limit=10)
def add(x, y):
    results = None
    try:
        run_time_job()
        results = x + y
    except SoftTimeLimitExceeded:
        print('time limit exceeded')
        redis_db.sadd('failed_jobs', 'failed at {} + {}'.format(x, y))
    except TimeLimitExceeded:
        raise KeyError()
    return results
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...