Запланированные задания сельдерея, созданные внутри других заданий, не передаются брокеру немедленно

У меня есть настройки сельдерея, как показано ниже:

@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.

Что я должен сделать, чтобы эти второстепенные задачи немедленно перешли к брокеру, не обременяя одного работника всеми задачами?

0 ответов

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