多个 django app 使用 celery 问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lixia625
V2EX    Django

多个 django app 使用 celery 问题

  •  
  •   lixia625 2015-11-26 11:07:05 +08:00 5236 次点击
    这是一个创建于 3641 天前的主题,其中的信息可能已经有所发展或是发生改变。
    采用 /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     Solana     4941 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 09:40 PVG 17:40 LAX 01:40 JFK 04:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86