Django:如何使用Celery忽略任务?

问题描述 投票:0回答:1

无需更改代码本身,是否可以忽略Celery中的任务?

例如,使用Django邮件时,存在Dummy Backend设置。这是完美的,因为它允许我从.env文件中停用某些环境(例如测试或暂存)中的邮件发送。处理邮件发送的代码本身不会用if语句或修饰符更改。

对于celery任务,我知道我可以使用模拟或装饰器在代码中完成此操作,但我想以兼容12因子的简洁方式进行此操作,例如Django邮件。有什么主意吗?

编辑以解释我为什么要这样做:

背后的主要动机之一是,它在Django Web服务器和Celery任务之间建立了耦合。例如,在运行单元测试时,如果代理服务器(对于我来说是Redis)未运行,则如果调用delay()方法,它将永远冻结,因为Celery尝试将任务发送到Redis时没有超时。从体系结构的角度来看,这是非常糟糕的。我希望我的单元测试可以正常运行,而无需运行Celery经纪人!

谢谢!

python django celery django-settings 12factor
1个回答
0
投票

就耦合而言,如果您使用虚拟后端,则您的Django应用程序仍将与celery绑定。仅您的任务将不会执行。也许这对于您来说是可以接受的,但我认为这可能会引起一些问题。例如,如果您要测试的一段代码将任务提交给celery,然后在稍后的部分中尝试检索该任务的结果,它将失败。因为虚拟后端永远不会执行任务。

对于单元测试,如您在问题中所述,可以使用task_always_eager设置。如果将其打开,则Django应用将不再依赖于正在运行的工作程序。它将以同步方式在同一线程中执行任务,并返回结果。

© www.soinside.com 2019 - 2024. All rights reserved.