在不更改代码本身的情况下,是否有一种方法可以忽略Celery中的任务?
例如,当使用Django邮件时,有一个Dummy Backend设置。这很完美,因为它允许我在某些环境(如测试或暂存)中从.env文件中停用邮件发送。处理邮件发送的代码本身不会使用if语句或装饰器进行更改。
对于芹菜任务,我知道我可以使用mock或装饰器在代码中完成它,但我希望以一种符合12factor的干净方式来完成它,就像Django邮件一样。有什么想法吗?
编辑以解释我为什么要这样做:
这背后的一个主要动机是,它在Django web服务器和Celery任务之间创建了耦合。例如,在运行单元测试时,如果代理服务器(对于我来说是Redis )没有运行,那么如果调用delay()方法,它将永远冻结,因为当Celery尝试向Redis发送任务时不会超时。从架构的角度来看,这是非常糟糕的。我希望我的单元测试可以在不需要运行芹菜代理的情况下正常运行!
谢谢!
发布于 2020-02-23 01:00:46
就耦合而言,如果您使用虚拟后端,您的Django应用程序仍将绑定到celery。只是你的任务不会被执行。也许这在你的情况下是可以接受的,但在我看来,它可能会造成一些问题。例如,如果您正在尝试测试的代码片段向celery提交了一个任务,并且在以后的部分中试图检索该任务的结果,那么它将失败。因为虚拟后端永远不会执行任务。
对于单元测试,正如您在问题中提到的,您可以使用task_always_eager设置。如果你打开它,你的Django应用程序将不再依赖于正在运行的worker。它将以同步方式在同一线程中执行任务,并返回结果。
https://stackoverflow.com/questions/60353595
复制相似问题