场景是这样的,假设我有一种类型的 celery task,
task name:
scan.xxx ,
celery config 里面配置了
scan.xxx 这个任务路由到 scan_tasks 这个队列中(采用得是 rabbitMQ )
同时有多个 worker 同时在监听该队列,比如 host1 host2 host3,concurrent = 4 (也就是每个 worker 最大并发为 4 个进程)
现在的场景:
需要我知道某个任务被哪一个 worker (或者说哪一个 host )执行了,目的是想获取所有 worker (所有 host )的情况,比如负载百分之多少,运行了几个进程,当前状态(idle running)等
现在的方案:
任务使用 apply_async()函数被异步执行时传递指定的队列名,这样的话
queue1 -> host1
queue2 -> host2
queue3 -> host3
这样会有问题:
如果以后我要增加任务执行的效率,提高程序性能,不关闭程序的情况下,我要预先开辟多个队列(假设现在考虑最多 10 个 worker ) queue1、queue2、queue3、...、queue10,十分不优雅
还有一种方案是在任务执行时,get_ip()然后记录,得到是在哪台机器上执行的,但是同样感觉很不优雅
对了,最后还有一种方案是 celery flower,但是它的 api 不稳定,我现在看看,有没有不借助 flower 的方案呢
不知各位有没有这样的场景,都是怎么做的,总感觉会有优雅的方案。