2014-02-19 3 views
4

Я использую сельдерей в моем приложении опоки, но сельдерей (3.1.8) .Это моя конфигурация с применением опокисельдерея не работает с применением опоки

celery.py

from __future__ import absolute_import 
from celery import Celery 
from cuewords.settings import CELERY_BROKER_URL,CELERY_RESULT_BACKEND 

app = Celery('proj', 
     broker=CELERY_BROKER_URL, 
     backend=CELERY_RESULT_BACKEND) 

app.conf.update(CELERY_TASK_RESULT_EXPIRES=3600) 

if __name__ == '__main__': 
    app.start() 

setting.py

CELERY_BROKER_URL='redis://localhost:6379/0' 
    CELERY_RESULT_BACKEND='redis://localhost:6379/0' 
    BROKER_TRANSPORT = 'redis' 

api.py

class Webcontent(Resource): 
    def post(self,session=session): 
    args = self.parser.parse_args() 
    site_url = args["url"] 
    url_present=Websitecontent.site_url_present(session,site_url) 
    if site_url.strip() != "" and not url_present: 
     try: 
     #add data and commit 
     session.commit() 
     websitecontent=Websitecontent(params*) 
     websitecontent.update_url(id,session) 
     except: 
     session.rollback() 
     raise 
     finally: 
     session.close()     
    else: 
     return "No data created/data already present" 

И в моей модели я добавляю метод к задаче

model.py

from cuewords.celery import app 
    class Websitecontent(Base): 

    @app.task(name='update_url') 
    def update_url(self,id,session): 
    ...code goes here.. 

И это, как я запустить сельдерей из командной строки

celery -A cuewords.celery worker 

И я также с помощью цветка контролировать задачу я могу видеть рабочий работает, но я не мог видеть любую задачи, ее пустую идеи .any что им недостающие или делать неправильно .. Благодаря

+0

Где твоя «фляжка»? –

+0

im написание api с использованием колбы и колба-restful.Above код show model.py, в котором я хотел, чтобы метод был поставлен в очередь .. – shiva

+0

Где вы вызываете или используете функцию задачи и как? –

ответ

7

Проблемы заключается в том, что ваши задачи никогда не импортируются в среду выполнения Python при запуске рабочего (-ов). Команда celery является вашей точкой входа. И вы говорите, что сельдерей импортирует ваш модуль cuewords.celery, потому что там, где находится экземпляр приложения. Однако здесь цепочка событий заканчивается, и никакой новый код Python не импортируется.

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

Чтобы обойти это, можно импортировать функции задачи в модуль приложения Celery и зарегистрировать их без использования стиля декоратора. Например:

from celery import Celery 
from models import my_task 

app = Celery() 
app.task(name='my_task')(my_task) 

Это устранит необходимость импорта экземпляра приложения в модуль модели.

Однако вы используете задачи метода. Задачи метода должны рассматриваться иначе, чем функции, как указано здесь: http://docs.celeryproject.org/en/latest/reference/celery.contrib.methods.html. Задачи метода отличаются от задач функций, потому что они связаны с экземпляром объекта. Другими словами, функция является функцией класса. Поэтому, чтобы использовать предыдущий стиль регистрации задач, вам понадобится экземпляр класса в первую очередь. Чтобы обойти это, вы должны рассмотреть возможность выполнения своих задач вместо методов.

Смежные вопросы