<p>关闭工作进程的建议过程是发送<code>TERM</code>信号。这将导致芹菜工人在完成任何当前正在运行的任务后关闭。如果向工作进程的主进程发送<code>QUIT</code>信号,工作进程将立即关闭。在</p>
<p>然而,celery文档通常从命令行或通过systemd/initd来讨论这一点,但是celery还通过<code>celery.app.control</code>提供了一个远程工作者控制API。<br/>
您可以<a href="http://docs.celeryproject.org/en/latest/reference/celery.app.control.html#celery.app.control.Control.revoke" rel="noreferrer">revoke</a>一个任务来阻止工作线程执行该任务。这应该可以防止您遇到的循环。此外,控件也以这种方式支持工作线程的<a href="http://docs.celeryproject.org/en/latest/reference/celery.app.control.html#celery.app.control.Control.shutdown" rel="noreferrer">shutdown</a>。在</p>
<p>所以我想下面这些会让你得到你想要的行为。在</p>
<pre><code>@app.task(bind=True)
def shutdown(self):
app.control.revoke(self.id) # prevent this task from being executed again
app.control.shutdown() # send shutdown signal to all workers
</code></pre>
<p>由于当前不可能从任务内确认任务,然后继续执行所述任务,使用<code>revoke</code>的方法可以避免这个问题,因此,即使任务再次排队,新的工作人员也会忽略它。在</p>
<p>或者,下面的操作也会阻止重新交付的任务再次执行。。。在</p>
^{pr2}$
<p>同样值得注意的是,<a href="http://docs.celeryproject.org/en/latest/reference/celery.result.html#celery.result.AsyncResult.revoke" rel="noreferrer">^{<cd5>}</a>还有一个<code>revoke</code>方法,它为您调用<code>self.app.control.revoke</code>。在</p>