Я хотел бы реализовать распределенную систему выполнения работ с сельдереем. Учитывая, что rabbitMQ не поддерживает приоритеты, и мне очень нужна эта функция, я обратился к сельдеру + redis.Задача приоритет в сельдерее с redis
В моей ситуации задачи тесно связаны с оборудованием, например, задача А может выполняться только на Рабочем 1, поскольку только ПК Работника 1 имеет необходимое оборудование. Я устанавливал CONCURRENCY каждого работника равным 1, чтобы каждый рабочий выполнял только одну задачу. Каждая задача занимает около 2 минут.
Для реализации приоритета функции, в первую очередь я попытался добавить priority
аргумент при вызове apply_async()
, например apply_async(priority=0)
и apply_async(priority=9)
. В этом тесте я запустил только одного Работника с COCURRENCY = 1 и отпустил 10 задач один за другим с разными приоритетами. Я ожидал увидеть, что задачи, начатые apply_async(priority=0)
, будут выполняться в приоритетном порядке, но, к сожалению, они только начинаются как начальный порядок.
Затем я пытаюсь выполнить некоторую работу. Я клонировал каждую задачу, поэтому для каждого из них у меня есть task_high и task_low, украшенные @celery.task(priority=0)
и @celery.task(priority=1)
. Затем я сделал тот же тест, что и выше, на этот раз было лучше, когда начальный порядок - «HH-LLLL-HHHH», реальный порядок - «HH-L-H-H-L-H-L-L-H». Я полагаю, что redis сделал некоторые работы по планированию и балансировке.
Но это все еще не может удовлетворить мои ожидания. Я надеюсь получить такой заказ, как «HHHHHH-LLLL», потому что для некоторых задач у меня есть только одна надлежащая машина с необходимым оборудованием и надеюсь, что приоритетная задача будет запущена как можно скорее.
Я искал другую работу в Интернете, например, используя две очереди, одну для высокоприоритетных задач, а другую для низкоприоритетных и используя 2 машины для первой и 1 машины для последней. Но поскольку мое оборудование довольно ограничено, это не работает для меня.
Не могли бы вы дать несколько предложений?
Спасибо за детали, но что я могу сделать, чтобы получить заказ, как я хочу? Должен ли я просто изменить «priority_steps»? – 2013-03-06 13:36:59
Вы просто попробуете его. С приоритетными шагами по умолчанию эти 0 и 1 будут объединены только в 0. – asksol
ОК спасибо, я пробовал с приоритетом 0 для задачи с высоким приоритетом и приоритетом 9 для задачи с низким, теперь это кажется намного лучше, хотя иногда некоторые задачи с приоритетом 9 все еще выполняются до тех, у кого приоритет 0. Я не знаю, есть ли что-то неправильно с моими конфигурациями, или это redis, который сделал некоторую работу балансировки. – 2013-03-07 01:11:13