将不同的任务路由到不同的队列

时间:2017-03-02 12:55:47

标签: python rabbitmq celery

我使用Celery和RabbitMQ作为经纪人。

创建Celery应用程序实例的代码是

from celery import Celery

name = __file__.split('.')[0]

app = Celery(name)
app.config_from_object('celery_config')


@app.task
def fetch_url(url):
  resp = requests.get(url)
  print resp.status_code

@app.task
def post(url, **kwargs):
  body = kwargs.get(payload)
  auth = kwrags.get(auth)
  resp = requests.put(url, data=body, auth=auth)

现在我想拥有2个独立的队列,一个用于GET,一个用于POST。

现在我知道我必须在celery配置模块中定义2个队列,如

CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default'),
    Queue('get', Exchange('get')),
    Queue('post', Exchange('post')),
)

我没有得到的正是为' routing_key'指定的字符串。选项?它应该是任务的名称(在这种情况下是get& post)还是有定义routing_key的规则?

1 个答案:

答案 0 :(得分:0)

无需为您的案例定义队列或处理简单任务路由的路由键,绑定或交换。现在使用自动路由(http://docs.celeryproject.org/en/latest/userguide/routing.html#automatic-routing

进行了大大简化(版本4.1)
  1. 命名您的任务。例如,假设您给出如下名称。
  2. @app.task(name='get_task') def fetch_url(url):

    @app.task(name='post_task') def post(url):

    1. 在celery配置文件中添加以下行,将任务路由到正确的队列。
    2. task_routes = { 'get_task': {'queue': 'get_queue'}, 'post_task': {'queue': 'post_queue'} }

      由于默认情况下启用了task_create_missing_queues配置,因此芹菜将负责为您创建队列。