V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
hanssx
V2EX  ›  Python

多个 celery worker 执行同一类型任务的场景,如何合理获得任务被执行在哪个 worker 上面?

  •  
  •   hanssx · 2018-10-25 14:39:51 +08:00 · 2396 次点击
    这是一个创建于 2248 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景是这样的,假设我有一种类型的 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 的方案呢

    不知各位有没有这样的场景,都是怎么做的,总感觉会有优雅的方案。
    3 条回复    2018-10-26 14:18:06 +08:00
    hanssx
        1
    hanssx  
    OP
       2018-10-25 15:27:58 +08:00
    kslr
        2
    kslr  
       2018-10-25 15:44:32 +08:00 via Android
    如果一台机器运行 20 个,那不是要浪费 19 次吗?
    为什么不单独监听呢,不管是其他监控报警和扩展都好处理
    hanssx
        3
    hanssx  
    OP
       2018-10-26 14:18:06 +08:00
    @kslr 兄弟没听明白你的意思,我只在一台机器运行一个 worker,在 20 台机器运行 20 个 worker。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   990 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:42 · PVG 04:42 · LAX 12:42 · JFK 15:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.