推荐学习书目
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 · Oct 25, 2018 · 2829 views
    This topic created in 2850 days ago, the information mentioned may be changed or developed.
    场景是这样的,假设我有一种类型的 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 replies    2018-10-26 14:18:06 +08:00
    hanssx
        1
    hanssx  
    OP
       Oct 25, 2018
    kslr
        2
    kslr  
       Oct 25, 2018 via Android
    如果一台机器运行 20 个,那不是要浪费 19 次吗?
    为什么不单独监听呢,不管是其他监控报警和扩展都好处理
    hanssx
        3
    hanssx  
    OP
       Oct 26, 2018
    @kslr 兄弟没听明白你的意思,我只在一台机器运行一个 worker,在 20 台机器运行 20 个 worker。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1005 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:53 · PVG 02:53 · LAX 11:53 · JFK 14:53
    ♥ Do have faith in what you're doing.