2014-02-19 98 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 

,我也用花來監視我可以看到一個工人正在運行的任務,但我看不到任何任務的空。任何想法是什麼即時通訊丟失或做錯了.. 感謝

+0

你的燒瓶應用程序在哪裏? –

+0

即時通訊使用燒瓶和燒瓶restful.Ibove代碼顯示model.py在我想要的方法排隊.. – shiva

+0

你在哪裏打電話或使用任務功能,以及如何? –

回答

7

問題在運行worker時,你的任務永遠不會被導入Python運行時。 celery命令是您的入口點。並且你告訴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。方法任務與函數任務不同,因爲它們與對象的實例關聯。換句話說,該函數是一個類函數。因此,要使用先前的註冊任務風格,首先需要一個類的實例。爲了解決這個問題,你應該考慮使你的任務功能,而不是方法。