Если вы управляете кодом задач, вы можете обойти проблему, позволяя задаче тривиально повторить попытку при первом ее выполнении, а затем отметив inspect().reserved()
. Повторная попытка регистрирует задачу с помощью обработчика результатов, и сельдерей может это увидеть. Задача должна принять self
или context
в качестве первого параметра, чтобы мы могли получить доступ к количеству повторов.
@task(bind=True)
def mytask(self):
if self.request.retries == 0:
raise self.retry(exc=MyTrivialError(), countdown=1)
...
Это решение не зависит от брокера, т.е. вам не нужно беспокоиться о том, используете ли вы RabbitMQ или Redis для хранения задач.
РЕДАКТИРОВАТЬ: после тестирования я обнаружил, что это только частичное решение. Размер зарезервированного ограничен настройкой предварительной выборки для работника.