[英]Django: How to ignore tasks with Celery?
在不更改代码本身的情况下,有没有办法忽略 Celery 中的任务?
例如,当使用 Django 邮件时,有一个Dummy Backend设置。 这是完美的,因为它允许我从.env
文件停用某些环境(如测试或暂存)中的邮件发送。 处理邮件发送的代码本身不会因if
语句或装饰器而改变。
对于 celery 任务,我知道我可以使用模拟或装饰器在代码中完成,但我想以一种符合 12 因素的干净方式来完成,就像 Django 邮件一样。 任何的想法?
这背后的主要动机之一是它在 Django web 服务器和 Celery 任务之间创建耦合。 例如,在运行单元测试时,如果代理服务器(对我来说是 Redis)没有运行,那么如果调用delay()
方法,它将永远冻结,因为当 Celery 尝试向 Redis 发送任务时没有超时。从架构的角度来看,这是非常糟糕的。 我希望我的单元测试能够正常运行而无需运行 Celery 代理!
谢谢!
就耦合而言,如果您使用虚拟后端,您的 Django 应用程序仍将绑定到 celery。 只是您的任务不会执行。 也许这在您的情况下是可以接受的,但在我看来,它可能会导致一些问题。 例如,如果您尝试测试的代码片段向 celery 提交了一个任务,而在稍后的部分中,尝试检索该任务的结果,它将失败。 因为虚拟后端永远不会执行任务。
对于单元测试,正如您在问题中提到的,您可以使用task_always_eager设置。 如果你打开它,你的 Django 应用将不再依赖于正在运行的 worker。 它将以同步方式在同一个线程中执行任务并返回结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.