我正在将芹菜工人从芹菜V3更新为芹菜V4,我的所有任务均为基于类的任务。我已经手动注册了这些任务,因为这是升级文档中指示的。
问题在于任务路由,我有以下任务:
class RegisterTask(Task):
routing_key = 'app_server.register'
def run(**params):
whatever ...
我正在运行两个芹菜工人,一个在默认队列上,另一个在寄存器队列上,如下:
# Default Worker
celery -A app_server worker --loglevel=info --concurrency=1
# Register Worker
celery -A app_server worker -Q app_server_register --loglevel=info --concurrency=1
这是我的队列定义:
CELERY_TASK_DEFAULT_QUEUE = 'app_server_default'
CELERY_TASK_DEFAULT_ROUTING_KEY = 'app_server.default'
CELERY_TASK_QUEUES = (
Queue('app_server_default', routing_key='app_server.default'),
Queue('app_server_register', routing_key='app_server.register')
)
意外行为是我使用芹菜V3和芹菜V4调用任务时看到的区别。
# Celery V3
RegisterTask().delay(**params)
# task is consumed by the register worker!
# Celery V4
RegisterTask().delay(**params)
# task is consumed by the default worker!
我希望任务被注册工作者(芹菜V3行为)消费,因此为什么我将基于类的任务中的 Routing_key_key 性进行了硬编码。但是芹菜V4似乎忽略了基于类的任务中的 Routing_key 属性。
[我还使用 redis 作为经纪人,如果有任何重要的话]
对此问题有任何想法吗?
谢谢!
routing_key
作为类属性在v4中弃用。
您可以将其提供给调用任务到apply_async
的Kwarg,也可以手动将路由任务类型配置为芹菜配置中的排队。请参阅文档
celery.task.base.Task
的任务类已针对celery.app.task.Task
弃用。
这是一种设计更改,新任务类别在使用任务时而不是在实例化时间时绑定配置。查看此评论
通过_get_exec_options
绑定任务时,可以通过源查看routing_key
。这里使用实例(self
)而不是类设置选项。
我已经通过查看芹菜源代码来收集了这一点,但是如果文档中没有提及贬值,我想它们已经过时了。
也许在他们的github上填补问题,并使用新范式中提供的一种选项是未来的最佳选择。
在文档中,任务将从任务元数据中读取task_key,因此基于类的任务不能再具有此元数据了?
正确,元数据不再在类对象上。它是通过config或懒惰的任务实例设置的。
。配置文件应为静态路由的goto,而设置任务调用应用于覆盖已配置的默认值。