2015-11-20 3 views
2

У меня есть установка Celery 3.1.19, в которой используется BROKER_URL, включая виртуальный хост.Сельдерей: @shared_task и нестандартный BROKER_URL

# in settings.py 
BROKER_URL = 'amqp://guest:[email protected]:5672/yard' 

сельдерея начинает работать нормально, загружает задачи, и задачи, которые я определить в @ app.task декоратор прекрасно работают. Я предполагаю, что моя конфигурация кролика и сельдерея с этой целью верна.

Задачи, определяемые с помощью @shared_tasks и загрузка с помощью app.autodiscover_tasks, по-прежнему загружаются правильно при запуске. Однако, если я вызываю задачу, сообщение заканчивается в (все еще существующем) amqp: // guest: guest @ localhost: 5672/virtual host.

Вопрос: Что мне здесь не хватает? Где общие задачи получают свою фактическую конфигурацию.

А вот еще некоторые детали:

# celery_app.py 

from celery import Celery 

celery_app = Celery('celery_app') 
celery_app.config_from_object('settings') 

celery_app.autodiscover_tasks(['connectors']) 

@celery_app.task 
def i_do_work(): 
    print 'this works' 

и разъемы/tasks.py (с инициализации .py в той же папке):

# in connectors/tasks.py 

from celery import shared_task 

@shared_task 
def I_do_not_work(): 
    print 'bummer' 

И снова shared Задача также подхвачена экземпляром Celery. Ему просто не хватает контекста для отправки сообщений вправо BROKER_URL.

КПП. почему shared_tasks так чисто документированы. Они полагаются на какой-то контекст Django? Я не использую Django.

Или мне нужны дополнительные параметры в моих настройках?

Большое спасибо.

+0

Ответ может быть здесь https://github.com/celery/celery/issues/1937. Но сегодня я должен остановиться. –

+0

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

ответ

2

Хорошо, я нашел преступника. Celery_app не был импортирован при запуске приложения. Поэтому в рамках моего проекта я добавил следующий код в init .py, сидящий на том же уровне модуля, что и определение celery_app.

from __future__ import absolute_import 

try: 
    from .celery_app import celery_app 
except ImportError: 
    # just in case someone develops application without 
    # celery running  
    pass 

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