Запланированные задания сельдерея, созданные внутри других заданий, не передаются брокеру немедленно
У меня есть настройки сельдерея, как показано ниже:
@celeryapp.task
def heavy_task(x, y):
# some stuff
for _ in range(10000):
heavy_task_2.apply_async(args=(x,y),
countdown=random.randint(60,120))
return x+y
@celeryapp.task
def heavy_task_2(x, y):
# some stuff
return x+y
У меня есть 5 рабочих (prefork) с 30 параллелизмом каждый. Все работает с аргументом prefetch_multiplier=1 и -Ofair. Я использую Redis Broker с CELERY_ACKS_LATE=True
Теперь я вызываю heavy_task(1,2).delay() из расписания ударов сельдерея, задачи отправляются любому 1 работнику, а затем все 10000 создаваемых им задач находятся только у этого работника и не публикуются для брокеров, чтобы другие работники могли работать над этими задачами. Prefetch_count работника продолжает увеличиваться до 10000
Только после того, как память исходного работника начинает расходоваться почти на 90%, эти задачи публикуются посреднику и, таким образом, переносятся на других работников. Иногда работника также убивают ОС, поэтому мои задачи теряются навсегда, поскольку они не являются "неподтвержденными" в Redis Broker.
Что я должен сделать, чтобы эти второстепенные задачи немедленно перешли к брокеру, не обременяя одного работника всеми задачами?