擅长:python、mysql、java
<p>以下是一个对我有用的解决方案:</p>
<p><strong>任务.py</strong>:</p>
<pre><code>from time import sleep
import random
@celery.task
def power(value, expo):
sleep(random.randint(10, 1000) / 1000.0) # sleep for 10-1000ms
return value ** expo
@celery.task
def amass(results, tasks):
completed_tasks = []
for task in tasks:
if task.ready():
completed_tasks.append(task)
results.append(task.get())
# remove completed tasks
tasks = list(set(tasks) - set(completed_tasks))
if len(tasks) > 0:
# resend the task to execute at least 1 second from now
amass.delay(results, tasks, countdown=1)
else:
# we done
print results
</code></pre>
<p><strong>用例:</strong></p>
<pre><code>tasks = []
for i in xrange(10):
tasks.append(power.delay(i, 2))
amass.delay([], tasks)
</code></pre>
<p>这个<em>应该</em>做的是尽快异步启动所有任务。一旦它们都被发布到队列中,<code>amass</code>任务也将被发布到队列中。在所有其他任务完成之前,amass任务将一直重新部署自己。</p>