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

Почему сельдерей добавляет тысячи очередей в rabbitmq, которые, похоже, сохраняются задолго до завершения задач?

Я использую сельдерей с бэкэндом кролика. Он производит тысячи очередей с 0 или 1 элементами в них в rabbitmq следующим образом:

$ sudo rabbitmqctl list_queues
Listing queues ...
c2e9b4beefc7468ea7c9005009a57e1d        1
1162a89dd72840b19fbe9151c63a4eaa        0
07638a97896744a190f8131c3ba063de        0
b34f8d6d7402408c92c77ff93cdd7cf8        1
f388839917ff4afa9338ef81c28aad75        0
8b898d0c7c7e4be4aa8007b38ccc00ea        1
3fb4be51aaaa4ac097af535301084b01        1

Это кажется неэффективным, но, кроме того, я заметил, что эти очереди сохраняются задолго до завершения обработки.

Я нашел задачу, которая, как представляется, делает это:

@celery.task(ignore_result=True)
def write_pages(page_generator):  
    g = group(render_page.s(page) for page in page_generator)
    res = g.apply_async()

    for rendered_page in res:
        print rendered_page # TODO: print to file

Кажется, что, поскольку эти задачи вызывают в группе, они бросаются в очередь, но никогда не освобождаются. Тем не менее, я явно потребляю результаты (поскольку я могу их просматривать, когда я повторяю через res. Поэтому я не понимаю, почему эти задачи сохраняются в очереди.

Кроме того, мне интересно, является ли создание большого количества очередей некоторыми показаниями, что я делаю что-то неправильно.

Спасибо за любую помощь в этом!

4b9b3361

Ответ 1

Сельдерей с бэкэндом AMQP будет хранить надгробия (результаты) задачи в очереди AMQP, названной с идентификатором задачи, который дал результат. Эти очереди будут сохраняться даже после исчерпания результатов.

Несколько рекомендаций:

  • Применить ignore_result = True для каждой задачи, которую вы можете. Не зависит от результатов других задач.
  • Переключитесь на другой бэкэнд (возможно, Redis - он все равно эффективнее): http://docs.celeryproject.org/en/latest/userguide/tasks.html