J'utilise Celery avec redis dans mon projet django. J'essaye d'appeler la fonction expire avec un délai de 10 secondes de mon célery_app. Chaque fois que la fonction s'exécute, la page indique simplement que localhost n'a pas répondu. Je suppose que c'est parce que mon backend ne fonctionne pas? quelqu'un peut-il aider s'il vous plait? P.S. la méthode get fonctionne si je retire les 2 lignes avec un résultatRedis backend ne fonctionne pas?
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)
Bonjour, merci d'avoir répondu. Lorsque je lance mon travail, la fonction s'exécute toutes les 40 secondes? C'est très bizarre. La fonction fonctionne mais localhost ne répond pas et ne me donne pas la page suivante – Jason
J'ai essayé CELERY_ALWAYS_EAGER et cela fonctionne maintenant apparemment mais il ne s'exécute pas après 40 secondes – Jason
Oui, 'CELERY_ALWAYS_EAGER' signifie que le code fonctionnera immédiatement - il est principalement utilisé pour le débogage. Le fait que cela fonctionne de cette façon signifie que votre problème est soit que votre thread de travail ne fonctionne pas, ou que le délai de 40 secondes est trop long. Vous pouvez supprimer 'CELERY_ALWAYS_EAGER' et essayer de supprimer' result.get() 'de votre code - la tâche sera toujours exécutée en 40 secondes, mais votre processus d'appel ne sera pas en attente. Si cela fonctionne de cette façon, alors vos employés de céleri sont en cours d'exécution - si cela ne fonctionne pas, alors vous avez probablement besoin de vérifier vos travailleurs. –