Django:如何忽略 Celery 的任务?
Django: How to ignore tasks with Celery?
在不更改代码本身的情况下,有没有办法在 Celery 中忽略任务?
例如,在使用Django邮件时,有一个Dummy Backend设置。这是完美的,因为它允许我从 .env
文件中停用某些环境(如测试或暂存)中的邮件发送。 if
语句或装饰器不会更改处理邮件发送的代码本身。
对于 celery 任务,我知道我可以使用模拟或装饰器在代码中完成,但我想以一种符合 12factors 的干净方式来完成,就像使用 Django 邮件一样。有什么想法吗?
编辑以解释我为什么要这样做:
这背后的主要动机之一是它在 Django 网络服务器和 Celery 任务之间创建了耦合。
比如运行ning单元测试的时候,如果broker服务器(我是Redis)不是运行ning,那么如果调用了delay()
方法,就会永远卡死,因为没有Celery 尝试向 Redis 发送任务时超时。
从架构的角度来看,这是非常糟糕的。我希望我的单元测试可以 运行 正确地进行,而不需要 运行 Celery 代理!
谢谢!
就耦合而言,如果您使用虚拟后端,您的 Django 应用程序仍将绑定到 celery。只是您的任务不会执行。也许这在您的情况下是可以接受的,但在我看来,它可能会导致一些问题。例如,如果您尝试测试的代码片段向 celery 提交了一个任务,而在稍后的部分中,尝试检索该任务的结果,它将失败。因为虚拟后端永远不会执行任务。
对于单元测试,正如您在问题中提到的,您可以使用 task_always_eager 设置。如果你打开它,你的 Django 应用程序将不再依赖于 运行 worker。它将以同步方式在同一个线程中执行任务,并 return 结果。
在不更改代码本身的情况下,有没有办法在 Celery 中忽略任务?
例如,在使用Django邮件时,有一个Dummy Backend设置。这是完美的,因为它允许我从 .env
文件中停用某些环境(如测试或暂存)中的邮件发送。 if
语句或装饰器不会更改处理邮件发送的代码本身。
对于 celery 任务,我知道我可以使用模拟或装饰器在代码中完成,但我想以一种符合 12factors 的干净方式来完成,就像使用 Django 邮件一样。有什么想法吗?
编辑以解释我为什么要这样做:
这背后的主要动机之一是它在 Django 网络服务器和 Celery 任务之间创建了耦合。
比如运行ning单元测试的时候,如果broker服务器(我是Redis)不是运行ning,那么如果调用了delay()
方法,就会永远卡死,因为没有Celery 尝试向 Redis 发送任务时超时。
从架构的角度来看,这是非常糟糕的。我希望我的单元测试可以 运行 正确地进行,而不需要 运行 Celery 代理!
谢谢!
就耦合而言,如果您使用虚拟后端,您的 Django 应用程序仍将绑定到 celery。只是您的任务不会执行。也许这在您的情况下是可以接受的,但在我看来,它可能会导致一些问题。例如,如果您尝试测试的代码片段向 celery 提交了一个任务,而在稍后的部分中,尝试检索该任务的结果,它将失败。因为虚拟后端永远不会执行任务。
对于单元测试,正如您在问题中提到的,您可以使用 task_always_eager 设置。如果你打开它,你的 Django 应用程序将不再依赖于 运行 worker。它将以同步方式在同一个线程中执行任务,并 return 结果。