Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜v4未按预期路由任务_Python_Django_Celery - Fatal编程技术网

Python 芹菜v4未按预期路由任务

Python 芹菜v4未按预期路由任务,python,django,celery,Python,Django,Celery,我正在将芹菜工人从芹菜v3更新到芹菜v4,我的所有任务都是基于类的任务。因为这是升级文件中指出的 问题在于任务路由,我有以下任务: 我正在运行两个芹菜工人,一个在默认队列上,另一个在注册队列上,如下所示: # Default Worker celery -A app_server worker --loglevel=info --concurrency=1 # Register Worker celery -A app_server worker -Q app_server_register

我正在将芹菜工人从芹菜v3更新到芹菜v4,我的所有任务都是基于类的任务。因为这是升级文件中指出的

问题在于任务路由,我有以下任务:

我正在运行两个芹菜工人,一个在默认队列上,另一个在注册队列上,如下所示:

# 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行为),因此我在基于类的任务中硬编码了路由_键属性。但是芹菜V4似乎忽略了基于类的任务中的routing_key属性

[我还使用redis作为经纪人,如果这很重要的话]

对这个问题有什么想法吗


谢谢

在v4中不推荐将密钥路由作为类属性

您可以在调用时将其提供给任务,如下所示 kwarg to
apply_async
,或者您可以在芹菜配置中手动配置队列的路由任务类型。 见


celery.Task.base.Task
中的任务类不推荐用于
celery.app.Task.Task

这是一种设计变更,在这种变更中,新任务类更倾向于在使用任务时绑定配置,而不是在实例化时绑定配置。 看

查看源代码,您可以看到使用
\u get\u exec\u options
绑定任务时设置了
路由键。选项是使用实例(
self
)而不是类设置的

我通过查看芹菜源代码收集了这些信息,但是如果文档中没有提到不推荐,我想它们已经过时了

也许在他们的github上填充一个问题并使用新范例中提供的选项之一是未来的最佳选择


在文档中,任务路由密钥将从任务元数据中读取,因此基于类的任务不能再具有此元数据了

正确,元数据不再位于类对象上。它是通过配置设置的,或者在调用时通过任务实例延迟设置的


配置文件应该是静态路由的goto,而任务调用上的设置应该用于覆盖配置的默认值。

我找不到表明它已弃用的文档。在我看来,这种行为似乎是“删除”的,而不是不赞成的。你能告诉我一个文档/讨论吗?任何表明它现在不受支持的内容以及原因?我特别想知道芹菜3.1.25工作者调用v4工作者的任务时会发生什么情况,它们都需要重新写入以明确指示路由_键,否则将进入默认队列?在文档中,任务路由_键将从任务元数据中读取,因此基于类的任务不能再具有此元数据?RE:任务将在默认队列中结束,您可以将队列配置为自动为任务创建请参见:感谢您花时间:)调用时,
\u get\u exec\u选项
似乎从self对象获取属性,而路由键设置为静态变量时,应该可以作为任何
self
对象上的属性访问,因此我不明白为什么它不起作用。还有一件事是,我试着编写一个自定义的
任务路由
函数,并显式返回路由密钥,但仍然不起作用。另一方面,从task_router函数显式返回{“queue”:“app_server_register”}可以工作,并且任务被重定向到正确的队列。但我不明白为什么:(
# Celery V3
RegisterTask().delay(**params)
# task is consumed by the register worker!

# Celery V4
RegisterTask().delay(**params)
# task is consumed by the default worker!