我正在详细阅读关于拒绝和重试任务的Celery文档(链接here)。致电raise self.retry(exc=exc)
和致电raise Reject(exc, requeue=True)
之间有什么区别?如果你要在拒绝时重新排队,那两者之间有什么区别吗?你为什么要一个做另一个?
这尤其令人困惑,因为文档会针对Reject
发出明确的无限循环警告,但不会针对self.retry()
发出警告。
答案 0 :(得分:2)
如果你重试任务,就像这样
raise self.retry(exc=exc)
它只会重试3次(默认)。您还可以指定要重试的次数。
raise self.retry(exc=exc, max_retries=10)
这将最多重试10次 。
另一方面,当你拒绝并取消它时,你可能会进入无限循环,因为没有最大限制。
如果要从第三方服务获取数据,则可以使用重试。即使第三方服务停止了几秒钟,这也将确保您获得数据。
我还没有在任何地方使用Reject
。让我们说,您想要连接到服务器上的端口8000
,并且还有一些其他进程偶尔会连接到同一个端口。
现在,在您的任务中,您可以尝试连接到端口,如果某个进程正在使用该端口,您可以简单地拒绝它并重新排队。这将发生,直到另一个进程停止监听8000并且您的任务最终将被执行。
但你必须确保,你将有机会成功执行任务,否则你将陷入困境。