2017-07-08 38 views
0

我正在使用Django,Celery和Jobtastic嘗試設置一些任務,我將在我的主webapp上進行輪詢。我正在使用RabbitMQ作爲我的經紀人。Jobtastic /芹菜/ RabbitMQ - AsyncResult總是等待

的問題是,當任務開始芹菜,試圖獲取狀態後顯示正常,如下圖所示:

def get_state(request, task_id): 
    if request.is_ajax(): 
     task = AsyncResult(task_id) 
     data = task.result or task.state 
     print(data) 
     json_data = json.dumps(data) 
     return JsonResponse(json_data) 

我無法得到任何其他狀態,但懸而未決。我的終端顯示該任務已完成,但我仍然處於PENDING狀態。我嘗試將CELERY_RESULT_BACKEND下的後端更改爲多個後端,包括DJCelery,AMQP和RPC。當啓動芹菜時,他們都顯示正確,所以我知道他們正在註冊。我也嘗試使用--pools = solo選項來啓動Celery,就像Windows平臺所建議的一樣,但也沒有任何運氣。下面是我的celery.py文件,我初始化芹菜應用程序。

from __future__ import absolute_import 

import os 

from celery import Celery 

# set the default Django settings module for the 'celery' program. 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'arbitrage.settings') 

from django.conf import settings # noqa 

app = Celery('arbitrage') 

# Using a string here means the worker will not have to 
# pickle the object when using Windows. 
app.config_from_object('django.conf:settings') 
app.conf.update(
    CELERY_RESULT_BACKEND='amqp', 
    BROKER_URL='amqp://' 
) 
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 


@app.task(bind=True) 
def debug_task(self): 
    print('Request: {0!r}'.format(self.request)) 

我實例芹菜用下面的命令:

celery -A arbitrage worker -l info --pool=solo 

任何幫助將不勝感激,我對芹菜3.1.5作爲Jobtastic不會芹菜版> 4.0的功能。

回答

0

最終成爲完全不相關的東西。 task_id傳遞給AsyncResult時無效,因此我總是得到Pending狀態,因爲Pending意味着狀態未知,即使對於僞造的id值也是如此。