Celery模块调用
- 既然celery是一个分布式的任务调度模块,那么celery是如何和分布式挂钩呢,celery可以支持多台不通的计算机执行不同的任务或者相同的任务。如果要说celery的分布式应用的话,我觉得就要提到celery的消息路由机制,就要提一下AMQP协议。具体的可以查看AMQP的文档。简单地说就是可以有多个消息队列(Message Queue),不同的消息可以指定发送给不同的Message Queue,而这是通过Exchange来实现的。发送消息到Message Queue中时,可以指定routiing_key,Exchange通过routing_key来把消息路由(routes)到不同的Message Queue中去Celery异步分布式
多进程
多worker,多队列
创建一个tasks.py文件,编辑内容如下:
#!/usr/bin/env python
# coding:utf-8
from celery import Celery
app = Celery() # 定义一个Celery对象
app.config_from_object("celeryconfig") # 通过celeryconfig.py对celery进行配置
@app.task # 定义了第一个task,add
def add(x,y):
return x+y
@app.task # 第二个task,multi
def multi(x,y):
return x*y
编辑celeryconfig.py文件如下:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from kombu import Exchange,Queue
BROKER_URL = "redis://192.168.48.131:6379/1"
CELERY_RESULT_BACKEND = "redis://192.168.48.131:6379/2"
CELERY_QUEUES = (
Queue("default",Exchange("default"),routing_key="default"),
Queue("for_add",Exchange("for_task_A"),routing_key="for_add"),
Queue("for_multi",Exchange("for_task_B"),routing_key="for_multi")
)
CELERY_ROUTES = {
'tasks.add':{"queue":"for_add","routing_key":"for_add"},
'tasks.multi':{"queue":"for_multi","routing_key":"for_multi"}
}
启动一个worker来指定taskA
- celery -A tasks worker -l info -n workerA.%h -Q for_add
- celery -A tasks worker -l info -n workerB.%h -Q for_multi
此时可以使用delay方法来调用两个worker
from tasks import *
re1 = add.delay(100, 200)
print(re1.result) # 300
re2 = multi.delay(100,200)
print(re2.result) # 20000
Celery与定时任务
- 在celery中执行定时任务非常简单,只需要设置celery对象中的CELERYBEAT_SCHEDULE属性即可。
下面我们接着在celeryconfig.py中添加CELERYBEAT_SCHEDULE变量:
CELERY_TIMEZONE = 'UTC'
CELERYBEAT_SCHEDULE = {
'taskA_schedule' : {
'task':'tasks.add',
'schedule':20, # 每20秒执行一次
'args':(5,6)
},
'taskB_scheduler' : {
'task':"tasks.multi",
"schedule":200, # 每200s执行一次
"args":(10,20)
},
}
注意格式,否则会有问题
Celery启动定时任务
- celery –A tasks beat