Celery 运行在不同的server上

1.基本概况

近期项目进行横向拓展会用到celery,于是开始研究celery的手册。在看手册的过程中发现,基本所有的官方例子都是运行在一台设备上,按照例子很容易就调通了。但实际的运行环境中肯定是部署在不同的设备上。那么如何部署在两个设备上呢?

2. 开始研究

  • 运行环境:
    2台ubuntu虚拟机,网段分别为(192.168.140.100和192.168.140.101)
    celery+rabbitMQ
  • 代码环境:
    (1)celery_master.py
#! /usr/bin/env python
# -*-coding:utf-8 -*-
import time
from celery import Celery
app = Celery('celery_worker', broker='amqp://guest@localhost//', backend='amqp://guest@localhost//')    

这里构建了一个celery中的application,其中broker采用本地rabbitMQ,账户为guest账户。这里的第一个参数要指定woker的名称。
PS: 这里特别需要注意第一个参数,这个参数为__main__

main
原手册地址
Name of the __main__ module. Required for standalone scripts.
If set this will be used instead of __main__ when automatically generating task names.

根据这段话,其实说明白点就是要执行具体任务的入口函数的地址,这里相当于执行celery_worker.__main__。 这里有个问题,如果你使用的是task.delay,这种方式,则必须指定这个celery为‘celery_worker’,告诉系统执行的是‘celery_worker’中的add。这块其实感觉比较混乱,总之,就是你要让任务找到它的执行空间就行。如果你采用send_task去完成这个任务,这块你的两个app对象的第一个参数就不需要如此考究了,因为你可以在send_task指定执行的是哪个函数。
例如:

result = app.send_task('celery_worker.add', [1, 2])  

对端的工程目录层级中包含一个‘celery_worker.py’的文件,里面有个add的函数。
这里推荐使用‘send_task’这种做法,这里为了展示Celery类实例化时候的第一个参数__main__的作用,完成了这种案例(不推荐这种写法,只是说明可行)。

@app.task
def add(a, b):
    pass    

这个地方定义了一个函数,名叫add,接受两个参数,但函数体里面为pass,其实这个很重要。很多人在写celery_master和celery_work的时候把add原封不动的重新copy了一次,两个文件中都实现了add函数。但其实,将任务分发过后,具体执行的add为celery_work中的add。这里我之所以写一个pass的函数,其实相当于C语言中的函数声明,因为发送任务的时候调用了add。

while (flag):
   print app.control.ping(timeout=0.5)  # 发送ping包,看是否能访问目标地址
   result = add.delay(1, 2) # 发送具体的任务和值
   print "ID: %s" % result.id
   if result.failed():
       flag = False
   print "Flag: %s" % flag
   time.sleep(1)  

这段代码很简单,实现的功能就是每隔1分钟发送给目标worker一个任务,任务为add,参数为1、2。
(2)celery_worker.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
from celery import Celery
app = Celery('who care', broker='amqp://guest@localhost//', backend='amqp://')

这里同样构建了一个celery中的application,可以看出这里的第一个参数可以随便设置。

@app.task
def add(a, b):
    print 'Start task'
    time.sleep(3)
    print 'Finish task'
    return a + b

具体的add逻辑,这里不用多解释了吧。
以上就是整个代码的部分。
为了验证代码能正常运行,将两个代码都放到192.168.140.100设备上。然后两个终端,分别执行
celery -A celery_worker worker --loglevel=infopython celery_master.py就能看到它们在本地工作了。

3.问题来了

上面这个例子很明显和官方文档差不了多少,其实这里就是想告诉大家如何委婉的解决master和worker中关于具体任务函数该如何写,当然还有其他方法,自行研究。
现在,问题的关键在于如何在不同的设备上分开部署celery_master和celery_worker。
先说一个问题,既然要部署在不同设备上,rabbitMQ是存在账号这个说法的,之前用的guest账号只能运行在localhost下。官方有明确说明("guest" user can only connect via localhost):http://www.rabbitmq.com/access-control.html
(1)登陆192.168.140.100机器,将celery_master.py拷贝到该机器,然后执行下面操作(http://stackoverflow.com/questions/25869858/celery-error-in-connecting-to-rabbitmq-server):
现在生成一个账号密码为test、test的 rabbitMQ账号,以及一个test-vhost的virtual host。命令如下:
sudo rabbitmqctl add_user test test
sudo rabbitmqctl set_permissions -p test-vhost test ".*" ".*" ".*"
完成上诉两个步骤候开始修改代码:

app = Celery('celery_worker', broker='amqp://test:test@localhost/test-vhost', backend='amqp://')  

(2)登陆192.168.140.101机器,将celery_worker.py拷贝到该机器,然后执行下面操作:
修改代码

app = Celery('who care', broker='amqp://test:test@192.168.140.100//', backend='amqp://')

完成上述步骤后,分别在两个机器上启动对应的指令:
192.168.140.100:python celery_master.py
192.168.140.101:celery -A celery_worker worker --loglevel=info
程序就会正常运作了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容