<p>如果要从初始任务运行另一个任务,只需像通常使用<a href="http://docs.celeryproject.org/en/latest/reference/celery.app.task.html#celery.app.task.Task.delay" rel="nofollow noreferrer">^{<cd1>}</a>,或<a href="http://docs.celeryproject.org/en/latest/reference/celery.app.task.html#celery.app.task.Task.apply_async" rel="nofollow noreferrer">^{<cd2>}</a>那样调用它:</p>
<pre><code>@celery.task
def myImprovedTask():
timeToWait = getTimeToNextAlarm()
sleep(timeToWait)
sendOutMessages()
myImprovedTask.delay()
</code></pre>
<p>如果你再次调用同一个任务也没关系。它与<code>delay()</code>一起排队,返回原始任务,然后运行队列中的下一个任务。在</p>
<hr/>
<p>所有这些都是在一个假设下进行的,即您实际上是在异步地调用芹菜任务。有时情况并非如此,常见的罪魁祸首是<a href="http://docs.celeryproject.org/en/latest/userguide/configuration.html#task-always-eager" rel="nofollow noreferrer">^{<cd4>}</a>config选项。默认情况下,它被禁用,<strong>但是</strong>(来自<a href="http://docs.celeryproject.org/en/latest/userguide/configuration.html#task-always-eager" rel="nofollow noreferrer">docs</a>):</p>
<blockquote>
<p>If <strong><code>task_always_eager</code></strong> is <code>True</code>, <strong>all tasks will be executed locally by blocking until the task returns</strong>. <code>apply_async()</code> and <code>Task.delay()</code> will return an <code>EagerResult</code> instance, that emulates the API and behavior of <code>AsyncResult</code>, except the result is already evaluated.</p>
<p>That is, tasks will be executed locally <strong>instead of being sent to the queue.</strong></p>
</blockquote>
<p>所以,确保你的芹菜配置包括:</p>
^{pr2}$