如何发送任务交换而不是在芹菜python中排队

时间:2017-09-21 10:41:15

标签: python rabbitmq celery

我从celery的文档中了解到,在发布任务时,您先将它们发送到交换机,然后将其委托给队列。现在我想将一个任务发送到特定的自定义交换,它将它收到的所有任务委托给3个不同的队列,这些队列将在后台拥有不同的消费者,执行不同的任务。

class Tasks(object):

    def __init__(self, config_object={}):
        self.celery = Celery()
        self.celery.config_from_object(config_object)
        self.task_publisher = task_publisher

    def publish(self, task_name, job_id=None, params={}):

        if not job_id:
        job_id = uuid.uuid4()
        self.celery.send_task(task_name, [job_id, params], queue='new_queue')

class config_object(object):

    CELERY_IGNORE_RESULT = True
    BROKER_PORT = 5672
    BROKER_URL = 'amqp://guest:guest@localhost'
    CELERY_RESULT_BACKEND = 'amqp'

tasks_service = Tasks(config_object)
tasks_service.publish('logger.log_event', params={'a': 'b'})

这就是我可以将任务发送到特定队列的方法,如果我不定义它被发送到默认队列的队列,但我的问题是如何定义要发送到的交换?

1 个答案:

答案 0 :(得分:0)

不确定您是否已解决此问题。 我上周遇到了同样的事情。 我在Celery 4.1上,我想出的解决方案就是定义交换名称和routing_key

所以在你的发布方法中,你会做类似的事情:

    def publish(self, task_name, job_id=None, params={}):

        if not job_id:
            job_id = uuid.uuid4()
            self.celery.send_task(
                task_name,
                [job_id, params],
                exchange='name.of.exchange',
                routing_key='*'
            )