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)
你好,謝謝你的回覆。當我運行我的工作人員時,該功能每40秒執行一次?這很奇怪。該函數運行,但本地主機does not響應,並沒有給我下一頁 – Jason
我試過CELERY_ALWAYS_EAGER,它現在顯然工作,但它不會執行40秒後 – Jason
是的,'CELERY_ALWAYS_EAGER'意味着代碼將馬上運行 - 它主要用於調試。事實上,這種方式意味着你的問題是你的工作者線程沒有運行,或者40秒超時太長。您可以刪除'CELERY_ALWAYS_EAGER'並嘗試從代碼中移除'result.get()' - 該任務仍將在40秒內執行,但您的調用者進程不會掛起等待它。如果這樣做,那麼你的芹菜工人正在運行 - 如果它不工作,那麼可能你需要檢查你的工人。 –