场景是这样的,假设我有一种类型的 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 的方案呢
不知各位有没有这样的场景,都是怎么做的,总感觉会有优雅的方案。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/501042
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.