Параллельные последовательные задачи celery
У меня есть длинный список очередей, которые должны выполняться последовательно, но очереди должны выполняться параллельно. Пример:
Tasks(Received by time): A1, B1, C1, D1, A2, C2, B2, A3, D2, D3, B4, A1, D4, C4
Queues: A=[A1,A2,A3,A4] , B=[B1, B2, B3, B4], C=[C1, C2, C3, C4] D=[D1, D2, D3, D4]
Итак, мне удалось использовать apply_async(args=..., queue='queue_{}'.format((id % 4) + 1)
, и маршрутизация выглядит нормально. Но есть одна проблема. У меня около 64 потоков CPU и когда я создаю 40 очередей, задачи не совсем выполняются параллельно.
Очереди с 1 по 8 начинают работать параллельно, но другие ждут, и в какой-то момент вдруг первые 8 задач замирают, а с 9 по 16 начинают работать.
Загрузка процессора составляет около 40-50%.
пример рабочей команды (40 раз выполняется с использованием supervisord):
celery -A bot worker -Q queue_19 -l ERROR --prefetch-multiplier=100 -c 1
Как я уже говорил, недостатка в ресурсах нет, потому что количество рабочих потоков составляет около 70% от потоков CPU. И оперативная память не будет заполнена