多worker、多队列
celery是一个分布式的任务调度模块,那么怎么实现它的分布式功能呢,celery可以支持多台不同的计算机执行不同的任务或者相同的任务。
如果要说celery的分布式应用的话,就要提到celery的消息路由机制,提到AMQP协议。
简单理解:
可以有多个"消息队列"(message Queue),不同的消息可以指定发送给不同的Message Queue,
而这是通过Exchange来实现的,发送消息到"消息队列"中时,可以指定routiing_key,Exchange通过routing_key来吧消息路由(routes)到不同的"消息队列"中去。
exchange 对应 一个消息队列(queue),即:通过"消息路由"的机制使exchange对应queue,每个queue对应每个worker。
下面我们来看一个列子:
vi tasks.py#!/usr/bin/env python#-*- coding:utf-8 -*-
from celery importCelery
app=Celery()
app.config_from_object("celeryconfig") #指定配置文件
@app.taskdeftaskA(x,y):return x +y
@app.taskdeftaskB(x,y,z):return x + y +z
@app.taskdefadd(x,y):return x + y
编写配置文件,配置文件一般单独写在一个文件中。
vi celeryconfig.py#!/usr/bin/env python#-*- coding:utf-8 -*-
from kombu importExchange,Queue
BROKER_URL= "redis://47.106.106.220:5000/1"CELERY_RESULT_BACKEND= "redis://47.106.106.220:5000/2"CELERY_QUEUES=(
Queue("default",Exchange("default"),routing_key="default"),
Queue("for_task_A",Exchange("for_task_A"),routing_key="for_task_A"),
Queue("for_task_B",Exchange("for_task_B"),routing_key="for_task_B")
)#路由
CELERY_ROUTES ={'tasks.taskA':{"queue":"for_task_A",&#