Python Django:如何忽略芹菜的任务?

Python Django:如何忽略芹菜的任务?,python,django,celery,django-settings,12factor,Python,Django,Celery,Django Settings,12factor,在不改变代码本身的情况下,有没有办法忽略芹菜中的任务 例如,当使用Django邮件时,有一个设置。这非常完美,因为它允许我从.env文件中停用某些环境中的邮件发送(如测试或登台)。处理邮件发送的代码本身不会使用if语句或修饰符进行更改 对于芹菜任务,我知道我可以使用模拟或装饰器在代码中完成,但我希望以符合12个因素的干净方式完成,比如Django邮件。有什么想法吗 编辑以解释我为什么要这样做: 这背后的一个主要动机是,它在DjangoWeb服务器和芹菜任务之间创建了耦合。 例如,在运行单元测试时

在不改变代码本身的情况下,有没有办法忽略芹菜中的任务

例如,当使用Django邮件时,有一个设置。这非常完美,因为它允许我从
.env
文件中停用某些环境中的邮件发送(如测试或登台)。处理邮件发送的代码本身不会使用
if
语句或修饰符进行更改

对于芹菜任务,我知道我可以使用模拟或装饰器在代码中完成,但我希望以符合12个因素的干净方式完成,比如Django邮件。有什么想法吗

编辑以解释我为什么要这样做: 这背后的一个主要动机是,它在DjangoWeb服务器和芹菜任务之间创建了耦合。 例如,在运行单元测试时,如果代理服务器(Redis For me)没有运行,那么如果调用了
delay()
方法,它将永远冻结,因为芹菜尝试向Redis发送任务时没有超时。 从架构的角度来看,这是非常糟糕的。我希望我的单元测试可以正常运行,而不需要运行芹菜代理


谢谢

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


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

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


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

如果不运行芹菜工人,任务是否会运行?@ArakkalAbu请检查我的编辑以了解目的:)如果不运行芹菜工人,任务会运行吗?@ArakkalAbu请检查我的编辑以了解其目的:)
task\u everys\u earge
是保护单元测试不被冻结的极好方法,谢谢你的想法!关于生产代码,如果Redis关闭,您如何确保没有冻结?(在我的例子中,后台任务不是业务关键型的,但web服务器是)。我想当芹菜试图连接到redis时,我应该添加一个超时和错误日志。@david。如果Redis(或任何你正在使用的代理)关闭,芹菜不会冻结。它会立即抛出错误。然而,如果工作人员处于停机状态,任务将保存在代理中,并在工作人员处于停机状态时执行。哦……我原以为这是默认行为,但经过一些研究,似乎是一个众所周知的错误:@DavidD。尝试升级你的芹菜版本。我在使用芹菜4.4.0时没有遇到任何这样的问题。我认为这并不能回答人们提出的问题。当然,我可以启用
task\u everys\u eager
,但是我有一个函数,它不依赖于它调用的任务的结果。我不想在测试期间浪费时间内联运行该任务,我只想静默忽略
apply\u async()
delay()
调用。理想情况下,不必模拟程序中的每个地方,就可以调用一个任务(可能是通过信号等)。
task\u everys\u eager
是保护单元测试不被冻结的一个很好的方法,感谢您的想法!关于生产代码,如果Redis关闭,您如何确保没有冻结?(在我的例子中,后台任务不是业务关键型的,但web服务器是)。我想当芹菜试图连接到redis时,我应该添加一个超时和错误日志。@david。如果Redis(或任何你正在使用的代理)关闭,芹菜不会冻结。它会立即抛出错误。然而,如果工作人员处于停机状态,任务将保存在代理中,并在工作人员处于停机状态时执行。哦……我原以为这是默认行为,但经过一些研究,似乎是一个众所周知的错误:@DavidD。尝试升级你的芹菜版本。我在使用芹菜4.4.0时没有遇到任何这样的问题。我认为这并不能回答人们提出的问题。当然,我可以启用
task\u everys\u eager
,但是我有一个函数,它不依赖于它调用的任务的结果。我不想在测试期间浪费时间内联运行该任务,我只想静默忽略
apply\u async()
delay()
调用。理想情况下,不必模拟程序中的每个地方,就可以调用任务(可能是通过信号等)