Celery предоставляет прекрасную статистику через интерфейс Inspect. Но это не особенно хорошо задокументировано (пока). Вот что мы имеем:
https://docs.celeryproject.org/en/stable/reference/celery.app.control.html#celery .app.control.Inspect.stats
https://docs.celeryproject.org/en/stable/userguide/workers.html#worker -статистика
Мне нравится то, что я вижу:
stats = current_app.control.inspect().stats()
, но структура немного загадочная. Многое из этого хорошо задокументировано выше, но, очевидно, не , каков верхний уровень этого возвращенного диктата. Это пример того, что я вижу:
{
<node id>: {
'total': {
<task name>: 1
},
'pid': 1233,
'clock': '467',
'pool': {
'max-concurrency': 8,
'processes': [1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242],
'max-tasks-per-child': 'N/A',
'put-guarded-by-semaphore': False,
'timeouts': [0, 0],
'writes': {
'total': 1,
'avg': '100.00%',
'all': '100.00%',
'raw': '1',
'strategy': 'fair',
'inqueues': {
'total': 8,
'active': 0
}
}
},
'broker': {
'hostname': '127.0.0.1',
'userid': <user id>,
'virtual_host': <virtual host name>,
'port': 5672,
'insist': False,
'ssl': False,
'transport': 'amqp',
'connect_timeout': 4,
'transport_options': {},
'login_method': 'AMQPLAIN',
'uri_prefix': None,
'heartbeat': 120.0,
'failover_strategy': 'round-robin',
'alternates': []
},
'prefetch_count': 32,
'rusage': {
'utime': 1.271573,
'stime': 0.171316,
'maxrss': 59800,
'ixrss': 0,
'idrss': 0,
'isrss': 0,
'minflt': 60288,
'majflt': 0,
'nswap': 0,
'inblock': 0,
'oublock': 0,
'msgsnd': 0,
'msgrcv': 0,
'nsignals': 0,
'nvcsw': 632,
'nivcsw': 54
}
}
}
В этой структуре я озадачен тем, что есть.
В настоящее время я работаю в режиме отладки, и я запускаю только одного работника с:
$ celery worker -A my_app -l INFO
и я вижу одну такую запись, как указано выше. Если я запускаю второго работника (в другом терминале на той же машине, с той же командой), то до тех пор, пока я вижу только один узел в sats.
Я могу видеть тот же идентификатор узла следующим образом:
$ celery -A Library status
<node id>: OK
1 node online.
Этот идентификатор узла принимает форму 'celery@myhostname'.
Если у меня работает один или два работника, это говорит мне, что у меня есть один узел в сети.
Пример pstree:
$ pstree -lp 7813
gnome-terminal-(7813)─┬─bash(4319)───[celeryd: celer(9896)─┬─[celeryd: celer(9900)
│ ├─[celeryd: celer(9901)
│ ├─[celeryd: celer(9902)
│ ├─[celeryd: celer(9903)
│ ├─[celeryd: celer(9904)
│ ├─[celeryd: celer(9905)
│ ├─[celeryd: celer(9906)
│ └─[celeryd: celer(9910)
├─bash(4404)───pstree(10229)
└─bash(7820)───[celeryd: celer(9995)─┬─[celeryd: celer(9997)
├─[celeryd: celer(9998)
├─[celeryd: celer(9999)
├─[celeryd: celer(10000)
├─[celeryd: celer(10001)
├─[celeryd: celer(10002)
├─[celeryd: celer(10003)
└─[celeryd: celer(10004)
Где я могу ясно видеть двух рабочих и их процессы пула. Но это один узел (что неудивительно).
Итак, что меня озадачивает:
- Что такое узел в точности?
- что значит иметь больше чем 1?
- Как получить больше, чем 1?
- Как я могу получить имена узлов программно (в Python не в командной строке)?