CELERY_ROUTES-如何根据任务名称进行路由

acl*_*wes 5 celery

我正在尝试让芹菜根据任务名称来路由任务...基本上,我有名为“ worker.some_name”和“ web.some_name”的任务,并且我使用了两个不同的队列,分别称为worker和网络分别。我希望所有工作人员任务都进入工作人员队列,反之亦然。目前,我有一个很大的CELERY_ROUTES字典,像这样:

CELERY_ROUTES = {
    "web.some_name": {
        "queue": "web"
    },
    "web.some_other_name": {
        "queue": "web"
    },
    etc.... }
Run Code Online (Sandbox Code Playgroud)

但是我想要一些更通用的东西:

CELERY_ROUTES = (MyRouter(), ) 
class MyRouter(object):
    def route_for_task(self, task, args=None, kwargs=None):
        if task.split('.')[0] == "worker":
            return {"queue": "worker"}
        return {"queue": "web"}
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用。有任何想法吗?谢谢。

Dan*_*din 2

您应该能够通过将交换类型从直接更改为主题来完成您想要的操作。这样您就可以将任务指定为 web.* 或worker.*

您可以在这里阅读:http ://ask.github.com/celery/userguide/routing.html#topic-exchanges