Да, если вам не нужно беспокоиться об общей пропускной способности, можно создать отдельную очередь и иметь выделенного работника с параллелизмом, установленного в 1. Вы можете создать столько очередей, сколько захотите, и настроить, какой из этих очереди, на которые каждый рабочий получает сообщения.
При запуске работника, вы можете передать параметр -Q
, чтобы установить его очереди и параметр -c
, чтобы установить, сколько потоков он использует, как описано в разделах Руководства рабочих Queues и Concurrency.
celery -A my_project worker -l info -Q queue1 -c 1
Затем вы можете настроить глобальные отображения, которые определяют, какие очереди каждую задачу переходит к использованию Routing Guide.
CELERY_ROUTES = { 'my_app.tasks.task1': {'queue': 'queue1'}, 'my_app.tasks.task2': {'queue': 'queue2'}, }
В качестве альтернативы, вы можете указать очереди в то время вы передаете каждый экземпляр задачи на основе Calling Tasks Guide.
task1.apply_async(queue='queue1')
Вы должны были бы реализовать какой-то механизм блокировки. Я сделал это через redis. – user2097159
Я не хотел идти за блокировкой, только если нет другого выхода. – spektom