2017-02-03 6 views
0

Рассмотрим код:Почему этот сельдерейский «мир привет» навсегда?

from celery import Celery, group 
from time import time 

app = Celery('tasks', broker='redis:///0', backend='redis:///1', task_ignore_result=False) 

@app.task 
def test_task(i): 
    print('hi') 
    return i 

x = test_task.delay(3) 
print(x.get()) 

Я запустить его по телефону python script.py, но я не получаю никаких результатов. Зачем?

ответ

1

У вас нет никаких результатов, потому что вы попросили ваше приложение для сельдерея выполнить задачу, не запустив рабочий процесс, чтобы выполнить выполняемую им работу. Процесс, который вы начали, заблокирован при вызове get().

Прежде всего, при использовании сельдерея крайне важно, чтобы задачи не выполнялись при импорте модуля, поэтому давайте выполним выполнение задачи внутри функции main() и поместим ее в файл с именем celery_test.py.

from celery import Celery, group 
from time import time 

app = Celery('tasks', broker='redis:///0', backend='redis:///1', task_ignore_result=False) 

@app.task 
def test_task(i): 
    print('hi') 
    return i 

def main(): 
    x = test_task.delay(3) 
    print(x.get()) 

if __name__ == '__main__': 
    main() 

Теперь давайте начнем пул работников сельдерея, чтобы выполнять задачи для этого приложения. Вы можете сделать это, открыв терминал и выполнив следующее.

celery worker -A celery_test --loglevel=INFO 

-A флага относится к модулю, где сельдерей будет найти приложение для добавления рабочих к. Вы должны увидеть некоторый вывод в терминале, чтобы указать, что рабочий сельдерей работает и готов к обработке задач.

Теперь попробуйте выполнить свой скрипт с помощью python celery_test.py. Вы должны увидеть hi, отображаемый в выходном файле журнала, но значение 3 возвращено в скрипте, который называется get().

Будьте осторожны, если вы играете с сельдереем без работы с работником, у него, вероятно, будет много задач, ожидающих вашего брокера. При первом запуске рабочего пула вы увидите, что все они выполняются параллельно, пока у брокера не закончится выполнение задач.

+0

Спасибо, это сработало. Мне нужно было только изменить «задачи» в четвертой строке на «celery_test». – d33tah