Задачи сельдерея исчезают - Джанго / Сельдерей - PullRequest
3 голосов
/ 28 декабря 2010

вот мой код:

моя задача

from celery.decorators import task

@task()
def add(x, y):
    return x + y

используя мои задачи

from core.tasks import add

results = []

for i in range(100):
    results.append(add.delay(i, i))

задача 1

через несколько секунд я выполняю следующее:

for result in results:
    print result.result

печатает это:

(значения не возвращаются в виде шаблона)

None
None
None
None
8
None
None
None
None
18
None
None
None
None
28
None
None
None
None
38
...

Вторая чистая установка ОС + настройка:

все работает, как и ожидалось, все еще не уверен, что здесь произошло ...


Задачи также случайно отсутствуют в интерфейсе администратора Django ...


Кто-нибудь знает, что происходит? : |

1 Ответ

4 голосов
/ 28 декабря 2010

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 каждые несколько секунд до завершения.

...