celery - 在 Django 应用程序中将 celery 4.x 升级到 5.x.x - execute_from_command_line() 替换

标签 celery django-celery celery-task

在 4.x.x 中的用法如下:

from tenant_schemas_celery.app import CeleryApp

class TenantCeleryApp(CeleryApp):
    def create_task_cls(self):
        return self.subclass_with_self('...', abstract=True, name='...', attribute='_app')

tenant_celery = TenantCeleryApp()
base = celery.CeleryCommand(app=tenant_celery)
base.execute_from_commandline('...')
...

现在将 celery lib 更新到 5.x.x 时显示以下错误:

base = celery.CeleryCommand(app=tenant_celery) 
TypeError: __init__() got an unexpected keyword argument 'app'

根据文档,新的 CeleryCommand 使用 click.Command 类,我如何更改我的代码以适应 - execute_from_commandline() 的替代用法是什么?

编辑: 经过一些努力后,以下代码有效:

tenant_celery.worker_main(argv=['--broker=amqp://***:***@rabbitmq:5672//***',
                                    '-A', f'{__name__}:tenant_celery',
                                    'worker', '-c', '1', '-Q', 'c1,c2,c3,c4'])

最佳答案

你可以在这里做一些事情。


从 python 中调用/启动 worker 的典型方法 is discussed at this answer :

worker = tenant_celery.Worker(
    include=['project.tasks']
)
worker.start()

在这种情况下,您将负责在完成后让工作人员退出。


要执行 CeleryCommand/click.Command,您将参数传递给 main 函数

base = CeleryCommand()
base.main(args=['worker', '-A', f'{__name__}:tenant_celery'])

在这种情况下,您仍然需要负责控制 celery 的退出方式。您可以为您希望调用的任何 celery 子命令选择 worker 以外的动词,例如 multi

您可能还想明确指定 name of the celery module for the -A parameter as discussed here .

关于celery - 在 Django 应用程序中将 celery 4.x 升级到 5.x.x - execute_from_command_line() 替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72273190/

相关文章:

django - django-celery (djcelery) 表有什么用?

django - 如何查找 celery 队列中未处理消息的数量

python - 创建 celery 任务的不同方法之间的区别

django-celery - Celery 任务在本地运行时在正常关闭时重新排队进入代理,但尽管配置相同但在 kubernetes 中丢失

python - 如何使用 redis 代理从 celery 中删除任务?

python - celery - 导入错误 : No module named tasks

celery - 在 Celery 任务中,retry_backoff 和 retry_backoff_max 会影响手动 self.retry() 调用吗?

celery - django-信号和 celery 之间的区别

创建模型对象时未触发 Django 信号

python - Django 更新 Celery 异步任务中的设置