Python Redis后端不工作?
我在django项目中使用芹菜和redis。我正在尝试从我的芹菜应用程序中以10秒的延迟调用expire函数。每当函数执行时,页面只会说localhost没有响应。我想这是因为我的后端不工作?有人能帮忙吗? 另外,如果我删除了带有result的两行,get方法就会起作用 芹菜应用程序pyPython Redis后端不工作?,python,django,redis,celery,Python,Django,Redis,Celery,我在django项目中使用芹菜和redis。我正在尝试从我的芹菜应用程序中以10秒的延迟调用expire函数。每当函数执行时,页面只会说localhost没有响应。我想这是因为我的后端不工作?有人能帮忙吗? 另外,如果我删除了带有result的两行,get方法就会起作用 芹菜应用程序py from __future__ import absolute_import import os from celery import Celery from django.conf import setti
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)
调用
result.get()
时,这实际上是在等待任务完成-请参阅
因此,在您的情况下,这将最多等待40秒,因为您已经设置了倒计时=40
。我认为大多数浏览器等待超时超过40秒,所以这可能不是你的问题
但是,您应该问自己:如果要在启动该任务的代码中等待它的结果,为什么要运行单独的任务
回到您的问题-错误表明您的单独任务没有运行。调试的一种方法是在设置中设置
芹菜\u ALWAYS\u EAGER=True
。这会使任务在调用过程中立即运行。如果代码在这些条件下工作,那么问题可能是芹菜工人没有运行。您好,感谢您的回复。当我运行worker时,函数每40秒执行一次?这很奇怪。该函数运行,但localhost没有响应,也没有给我下一个页面。我尝试了CELERY\u ALWAYS\u Earge,现在它显然可以工作,但40秒后它不会执行。CELERY\u ALWAYS\u Earge
意味着代码将立即运行-它主要用于调试。它以这种方式工作的事实意味着您的问题要么是您的工作线程没有运行,要么是40秒超时太长。您可以删除芹菜\u ALWAYS\u EAGER
并尝试从代码中删除result.get()
——任务仍将在40秒内执行,但您的调用进程不会挂起等待它。如果它是这样工作的,那么你的芹菜工人正在运行-如果它不工作,那么你可能需要检查你的工人。