2017-07-23 52 views
0

我在我的django項目中使用了redis的Celery。我試圖從celery_app延遲10秒鐘來調用expire函數。每當函數執行時,該頁面只是說本地主機沒有響應。我假設它是因爲我的後端不工作?任何人都可以幫忙嗎? P.S.如果我刪除了2線,結果Redis後端不工作?

celery_app.py

from __future__ import absolute_import 
import os 
from celery import Celery 

from django.conf import settings 
from celery.schedules import crontab 

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

app = Celery('IrisOnline', broker='redis://localhost:6379/0',backend="redis://localhost:6379/0",include=[ 
    "IrisOnline.tasks", 
    "order_management.tasks" 
]) 

app.conf.update(
    task_serializer='json', 
    accept_content=['json'], 
    result_serializer='json', 
    timezone='Asia/Manila', 
) 
app.conf.beat_schedule = { 
    'add-every-30-seconds': { 
     'task': 'IrisOnline.tasks.printthis', 
     'schedule':(crontab(hour=13,minute=33)), 
    }, 
} 

app.config_from_object('django.conf:settings') 

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 

@app.task(name="expire") 
def expire(): 
    print("object expired") 

views.py

def get(request): 

    if "approved_cart" not in request.session or not request.session["approved_cart"]: 
     return redirect("/checkout/cart/") 

    cart = request.session["cart"] 
    customer = Customer.objects.get(user=request.user) 
    order = Order.objects.create(customer=customer) 

    result = expire.apply_async(countdown=40) #these causes the errors 
    result.get() 


    for product_id, quantity in cart.items(): 
     # Deduct from inventory 
     product = Product.objects.get(id=product_id) 
     product.quantity -= quantity 
     product.save() 

     # Add quantity to order 
     OrderLineItems.objects.create(
      product=Product.objects.get(id=product_id), 
      quantity=quantity, 
      parent_order=order 
     ) 

    request.session["cart"] = {} # Empty cart 
    request.session["approved_cart"] = False 
    request.session.modified = True 
    context = make_context(request) 
    context["total_price"] = order.total_price 

    return render(request, 'purchase.html', context) 

回答

0

當你調用result.get()這其實等待任務完成get方法的工作原理 - 請參閱Celery documentation

所以在你的情況下,最好等待40秒,因爲你已經設置了countdown=40。我認爲大多數瀏覽器等待超過40秒,所以這可能不是你的問題。

但是,您應該真的問自己:如果您要等待啓動該任務的代碼中的結果,您爲什麼要運行單獨的任務?

回到您的問題 - 錯誤表明您的單獨任務未運行。一種調試方法是在您的設置中設置CELERY_ALWAYS_EAGER = True。這使得任務可以在調用過程中立即運行。如果代碼在這些條件下工作,那麼問題可能是你的芹菜工人沒有運行。

+0

你好,謝謝你的回覆。當我運行我的工作人員時,該功能每40秒執行一次?這很奇怪。該函數運行,但本地主機does not響應,並沒有給我下一頁 – Jason

+0

我試過CELERY_ALWAYS_EAGER,它現在顯然工作,但它不會執行40秒後 – Jason

+0

是的,'CELERY_ALWAYS_EAGER'意味着代碼將馬上運行 - 它主要用於調試。事實上,這種方式意味着你的問題是你的工作者線程沒有運行,或者40秒超時太長。您可以刪除'CELERY_ALWAYS_EAGER'並嘗試從代碼中移除'result.get()' - 該任務仍將在40秒內執行,但您的調用者進程不會掛起等待它。如果這樣做,那麼你的芹菜工人正在運行 - 如果它不工作,那麼可能你需要檢查你的工人。 –