Get waiting tasks count in Celery
If you’re using Redis as broker, you can simply run the following command to get the number of waiting tasks in a queue:
$ redis-cli -h HOST -p PORT -n DATABASE_NUMBER llen QUEUE_NAME
The default queue is named celery
. It’s a list so you can get its length with the llen
command.
Celery provides the inspect reserved
command, and what you’ll get is a list of tasks that have been prefetched by the worker. By default, the prefetch count is worker_prefetch_multiplier (default is 4) multiplied by the number of concurrent worker processes.
So which queue are these tasks stored in?
Let’s run redis-cli
in interactive mode, then select the database used by broker and list all keys:
127.0.0.1:6379> keys *
1) "celery"
2) "_kombu.binding.celeryev"
3) "unacked"
4) "unacked_index"
5) "_kombu.binding.celery"
6) "_kombu.binding.celery.pidbox"
You can see a key named unacked
.
unacked
is a hash, you can get the length of it by using the hlen
command:
127.0.0.1:6379> type unacked
hash
127.0.0.1:6379> hlen unacked
(integer) 4
And use the hgetall
command to get all the fields and values:
127.0.0.1:6379> hgetall unacked
1) "8a64f4bb-2fd3-4d37-a273-8fd136190dcf"
2) "[{\"body\": \"\", \"content-encoding\": \"utf-8\", \"content-type\": \"application/json\", \"headers\": {\"lang\": \"py\", \"task\": \"mytask\", \"id\": \"0299a9c5-9ff7-4bec-8bb7-fa88f7067a9b\", ...]"
...
Note that the id shown in the value is the same as the one you got with the inspect reserved
command. Reserved tasks are stored in the unacked
queue.
By the way, unacked_index
is a zset (sorted set) with timestamps as scores.
127.0.0.1:6379> type unacked_index
zset
127.0.0.1:6379> zrange unacked_index 0 -1 withscores
1) "13ad4b23-a283-48ee-a177-06f65b519af7"
2) "1661418249.2947526"
3) "8a64f4bb-2fd3-4d37-a273-8fd136190dcf"
4) "1661418249.2968478"
...