Почему celery.control.inspect сообщает о меньшем количестве задач в очереди, чем rabbitmqctl?
rabbitmqctl
правильно сообщает о тысячах задач в очереди:
$ sudo rabbitmqctl -q list_queues name messages messages_ready messages_unacknowledged
default 13142 13126 16
Еще сельдерей сообщает:
>>> len(app.control.inspect().active()['celery@default'])
4
>>> len(app.control.inspect().scheduled()['celery@default'])
1
>>> len(app.control.inspect().reserved()['celery@default'])
16
>>> len(app.control.inspect().revoked()['celery@default'])
0
Правильное число (тысячи) задач, кажется, появляется в app.control.inspect().stats()['celery@default']['total']
, но я действительно хочу знать правильное количество невыполненных задач из очереди в Python, и active()
и т. д., кажется, сообщают только до 16 или около того - может быть, есть предел?
За исключением использования привилегированных вызовов подпроцесса rabbitmqctl
Как я могу получить полное количество задач в очереди из Python, предпочтительно через celery
(кстати, этот сервер использует Celery 3.1.8 в настоящее время)
1 ответ
App.control.inspect компании Celery будет проверять задачи, которые выполняются только работающими работниками.
Даже если у вас есть тысячи задач в очереди, ваш работник будет выполнять только несколько указанных задач в любой момент времени. Это active
задачи.
Кроме того, работник может предварительно выбрать некоторые задачи, которые будут зарезервированы для этого работника. Это будет показано в reserved
задачи.
Если вы установили ETA для своих задач или если есть периодические задачи, они попадут под scheduled
задачи.
Похоже, вы запустили рабочий с параллелизмом 4 (или рабочий с настройками по умолчанию на 4-ядерном компьютере). Таким образом, активными задачами являются 4. Каждый рабочий процесс предварительно выбрал 4 задачи, что привело к 16 зарезервированным задачам.
AFAIK, нет способа получить общее количество задач в очереди с сельдереем.
Однако есть несколько решений Python для получения общего количества сообщений в очереди. Вы можете проверить мой другой ответ здесь для других способов сделать это.
Обновить:
pika
клиент Python для взаимодействия с rabbitmq Вы можете использовать его для потребления сообщений. Вот простой пример использования каждого сообщения. Вы можете проверить больше примеров использования на pika docs.