V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lixia625
V2EX  ›  Django

多个 django app 使用 celery 问题

  •  
  •   lixia625 · 2015-11-26 11:07:05 +08:00 · 4897 次点击
    这是一个创建于 3274 天前的主题,其中的信息可能已经有所发展或是发生改变。
    采用 /etc/init.d/celeryd 方式启动的守护进程
    查了下文档 celeryd 貌似只能对应设置一个 app ?这样的话只有这一个 app 的 task 能被成功执行
    如何让多个 app 同时拥有各自不同的 celery 守护进程?
    13 条回复    2016-01-13 12:07:17 +08:00
    neoblackcap
        1
    neoblackcap  
       2015-11-26 11:21:02 +08:00   ❤️ 1
    那,你为什么不试试自己用 supervisor 去管理你的 celery 守护进程啊。我没试过系统自带的。 supervisor 倒是可以配置多个守护进程。

    同时为什么要隔离呢?不是只要 worker 能执行就好了吗?按道理你只要将你的 task 注册了就好了
    lixia625
        2
    lixia625  
    OP
       2015-11-26 11:25:29 +08:00
    @neoblackcap 我也是这么想的,但目前只有一个 app 的 task 能被执行,是我 celeryd 的姿势不对么?
    neoblackcap
        3
    neoblackcap  
       2015-11-26 11:37:47 +08:00
    @lixia625 我觉得是你的 celery 配置没设置好,你的 task 没有注册,你倒是发一下 log 啊
    lixia625
        4
    lixia625  
    OP
       2015-11-26 11:47:01 +08:00
    @neoblackcap

    # Names of nodes to start
    # most will only start one node
    CELERY_NODES="worker"
    # but you can also start multiple and configure settings
    # for each in CELERYD_OPTS (see 'celery multi --help' for example)
    #CELERY_NODES="worker1 worker2 worker3"

    # Absolute or relative path to the 'celery' command
    CELERY_BIN="/usr/local/bin/celery"
    # CELERY_BIN="/virtualenvs/def/bin/celery"

    # App instance to use
    # comment out this line if you don't use an app
    CELERY_APP="app1"
    # or fully qualified:
    #CELERY_APP="proj.tasks:app"

    # Where to chdir at start
    CELERYD_CHDIR="/var/www/app1/"

    # Extra command-line arguments to the worker
    CELERY_OPTS="--time-limit=1800 --concurrency=8"

    # %N will be replaced with the first pat of the nodename.
    CELERYD_LOG_FILE="/var/log/celery/%N.log"
    CELERYD_PID_FILE="/var/run/celery/%N.pid"

    ...


    这样的话 app1 是完全正常的,但也只有 /var/www/app1/的任务被执行, log 里也只有 app1 的 log 啊
    我现在的问题就是我还有一个 /var/www/app2/我该怎么弄 T_T
    neoblackcap
        5
    neoblackcap  
       2015-11-26 12:01:32 +08:00
    你这个配置文档是在哪里的?/etc/celeryd?
    你用 django 的,我真的建议你用 supervisor 去一起管理你的应用,具体请参考[document]( http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html?highlight=celery_app)
    neoblackcap
        6
    neoblackcap  
       2015-11-26 12:03:12 +08:00
    @lixia625 你只注册 app1 那肯定只会跑 app1 啊,还有就是你用什么版本的 celery 啊?
    xunyu
        7
    xunyu  
       2015-11-26 12:25:08 +08:00
    settings.py 里面加上
    CELERY_IMPORTS = ('xxxx',
    'xxxx')
    然后执行 worker 就可以了
    julyclyde
        8
    julyclyde  
       2015-11-26 13:37:15 +08:00
    不要总是建议别人怎么办
    还要说出这种建议的理由

    上面几位我觉得自己可能都不懂 celery 的配置吧
    lixia625
        9
    lixia625  
    OP
       2015-11-26 16:49:57 +08:00
    @neoblackcap
    @xunyu
    @julyclyde


    在 /etc/init.d/celeryd 中,发现这样一段话

    # To implement separate init scripts, copy this script and give it a different
    # name:
    # I.e., if my new application, "little-worker" needs an init, I
    # should just use:
    #
    # cp /etc/init.d/celeryd /etc/init.d/little-worker
    #
    # You can then configure this by manipulating /etc/default/little-worker.
    #

    于是我照着做了,创建了另一个脚本,启动进程,然后两个网站的任务都能被接收到并执行了。
    另外我也试了用 supervisor ,也达到了同样的效果。

    然而。。。

    事情是这样的,这实际上是两个相同的网站,只不过连了不同的数据库,所以在我以为搞定了的时候,发现两者的任务混在了一起,也就是 app1 中触发的任务,一会儿改动的是 app1 连的数据库,一会儿改动的是 app2 连的数据库

    这又是什么情况,用的是 rabbitmq ,看现象大概是它无法区分两个 app 发来的任务?
    正确的做法应该是什么? route ? queue ?还是多个 rabbitmq host ?
    julyclyde
        10
    julyclyde  
       2015-11-26 17:38:27 +08:00
    You can then configure this by manipulating /etc/default/little-worker 这一步做了吗?
    julyclyde
        11
    julyclyde  
       2015-11-26 17:38:50 +08:00
    不同任务应该用不同的队列吧。你在 rabbitmq 里新增一个 queue 呗
    neoblackcap
        12
    neoblackcap  
       2015-11-26 18:04:12 +08:00
    @julyclyde
    队列不是因为这样才分,是看你要不要优先处理你的特定任务。比如 task1 的处理不应堵塞 task2 那么就应该采用不同队列而且分配不同的 worker 去处理

    @lixia625
    你 task 里面的 settings 读错了,还是用同样的参数,那肯定是连到同样的数据库里面。
    111111111111
        13
    111111111111  
       2016-01-13 12:07:17 +08:00
    @neoblackcap
    老司机,请教一下
    不同应用是可以使用同一个队列的的吗?
    那么各应用在更新了代码之后,怎么用重启 celery 呢?
    生产环境怎么安排比较好呢




    @lixia625
    lz 问题搞定了吗?最近遇到同样问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5768 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 01:44 · PVG 09:44 · LAX 17:44 · JFK 20:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.