擅长:python、mysql、java
<p>问题不在于celery不允许在您的示例中执行异步任务,而是您将遇到死锁,因此警告:</p>
<p>假设您有一个任务a,它通过<code>apply_async()</code>生成许多子任务B。这些任务中的每一个都是由一个工人执行的。问题是,如果任务B的数量大于可用工作线程的数量,任务A仍然在等待它们的结果(至少在您的示例中,它不是默认的)。当任务A仍在运行时,已执行任务B的工人将<em>而不是</em>执行另一个任务,它们被阻塞,直到任务A完成。(我不知道确切原因,但就在几周前我遇到了这个问题。)</p>
<p>这意味着在手动关闭工人之前,芹菜不能执行任何操作。在</p>
<p><strong>解决方案</strong></p>
<p>这完全取决于您将如何处理任务结果。如果您需要它们来执行下一个子任务,您可以通过<a href="http://docs.celeryproject.org/en/latest/userguide/calling.html#linking-callbacks-errbacks" rel="nofollow">Linking with callbacks</a>或将其硬编码到相应的任务中(这样您就可以调用第一个子任务,而调用第二个子任务,依此类推)。在</p>
<p>如果只需要查看它们是否被执行以及是否成功,可以使用<a href="http://docs.celeryproject.org/en/latest/userguide/monitoring.html#flower-real-time-celery-web-monitor" rel="nofollow">flower</a>监视任务。在</p>
<p>如果您需要进一步处理所有子任务的输出,我建议将结果写入一个xml文件:让任务A调用所有任务B,完成后执行任务C来处理结果。也许还有更优雅的解决方案,但这肯定避免了僵局。在</p>