Task.delay () является асинхронным.Кстати, все дело в AMQP в том, чтобы делать задачи асинхронными.Если вы хотите синхронного поведения, какой смысл использовать сельдерей?
from celery.decorators import task
@task()
def add(x, y, results):
results.append(x + y)
------------8<-------------
from core.tasks import add
results = []
for i in range(100):
add.delay(i, i, results)
Подождите несколько секунд перед печатью (пока потребители выполняют свою работу) и помните, что результаты могут быть не в порядке.
Метод task.delay вернет экземпляр celery.result.AsyncResult.Перед использованием AsyncResult.result вы должны проверить AsyncResult.state == SUCCESS.
Ваш последний цикл печати может быть:
for result in results:
while not result.state.ready():
time.sleep(secs)
if result.state == u'SUCCESS':
print result.result
else:
print "Something Rotten in the State of Denmark..."
Это (почти) то же самое, что:
for result in results:
print result.get()
Посмотрите на TaskSets , они лучше, чем хранение результатов в списке.
На практике люди сохраняют результаты в базе данных и помещают цикл ожидания в клиент, который будетзатем забивайте сервер через AJAX каждые несколько секунд до завершения.