在 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/