1

在不更改代码本身的情况下,有没有办法忽略 Celery 中的任务?

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

对于 celery 任务,我知道我可以使用模拟或装饰器在代码中完成它,但我想以一种符合 12factors 的干净方式来完成它,就像使用 Django 邮件一样。任何想法?

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

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

谢谢!

4

1 回答 1

1

就耦合而言,如果您使用虚拟后端,您的 Django 应用程序仍将绑定到 celery。只是你的任务不会执行。也许这在您的情况下是可以接受的,但在我看来,这可能会导致一些问题。例如,如果您尝试测试的代码片段向 celery 提交了一个任务,然后在稍后的部分中尝试检索该任务的结果,它将失败。因为虚拟后端永远不会执行任务。

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

于 2020-02-22T17:00:46.120 回答