Влад Коваль, я решал подобную задачу следующим образом. Мне нужно было писать лог количества в асинхронных задачах, но лог получался примерно такой -> 4, 3, 5, 2, 1, -1, 0 и тд. из-за того что задачи выполнялись параллельно. Решение следующее, нужно создать 4 (или сколько вам будет нужно) очереди default_0, default_1, default_2, default_3, так как обработка выполнялась над записью в БД, то я имел id этой записи. Я брал остаток от деления id % 4, где 4 это количество очередей, на выходе получал число от 0 до 3 и в зависимости какое получалось число я в ту очередь и отправлял задачу. Таким образом работа над записью с определенным id всегда выполнялась в определенной очереди.
Разумеется все эти 4 очереди нужно запускать в 1 инстанс
celery --app=conf.celery.application worker -c 1 -Q localhost_0
celery --app=conf.celery.application worker -c 1 -Q localhost_1
celery --app=conf.celery.application worker -c 1 -Q localhost_2
celery --app=conf.celery.application worker -c 1 -Q localhost_3
Задачи в очередь помещаются вот так
update_quantity_task.apply_async(
kwargs={
'goods_id': related_product.goods_id,
},
queue='default_{}'.format(related_product.goods_id % 4),
)
Вот и все, задачи выполняются и параллельно и последовательно