Установка параллелизма сельдерея до 1 рабочего на очередь - PullRequest
4 голосов
/ 07 июля 2011

Я, по сути, использую очереди rabbitmq в сельдерее для синхронизации бедняков. Например, когда некоторые объекты обновляются (и имеют высокую стоимость), я округляю их в набор из 10 очередей на основе их идентификаторов объектов. Во-первых, это общая схема или есть лучший способ.

Во-вторых, с celeryd кажется, что опция уровня параллелизма (CELERY_CONCURRENCY) устанавливает количество рабочих во всех очередях. Этот вид поражений с целью использования очередей для синхронизации в качестве очереди может обслуживаться несколькими работниками, что означает потенциальные условия гонки при выполнении различных действий над одним и тем же объектом.

Есть ли способ установить уровень параллелизма (или параметры пула рабочих), чтобы у нас было по одному рабочему на N очередей?

Спасибо Шри

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

Почему вы просто не реализуете глобальную систему блокировки задач, используя memcache или nosql db? Таким образом вы избегаете любых рас.

Вот пример http://ask.github.com/celery/cookbook/tasks.html#ensuring-a-task-is-only-executed-one-at-a-time

0 голосов
/ 11 ноября 2013

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

По сути, вы можете направить непосредственно к работнику в зависимости от ключа, который в вашем случае является идентификатором. Это исключает необходимость в единой точке блокировки. Надеюсь, это полезно, хотя этому вопросу 2 года:)

...