Python 3.x 在任务执行期间从芹菜工人捕获失败的任务
我目前正在芹菜中使用Python 3.x 在任务执行期间从芹菜工人捕获失败的任务,python-3.x,asynchronous,rabbitmq,celery,django-celery,Python 3.x,Asynchronous,Rabbitmq,Celery,Django Celery,我目前正在芹菜中使用Task.delay()(与RabbitMQ一起)执行异步任务。这些任务被分配给8名工作人员,在这些任务中,我正在执行数据库插入操作 有时任务会失败,数据库插入不会发生。这可能是由于超时或JSON解码错误造成的。我想捕捉执行失败的情况 以下是相关代码: 视图.py def celery_url_filtering(request): for each_data in dataset: #each_data is a Json object
Task.delay()
(与RabbitMQ一起)执行异步任务。这些任务被分配给8名工作人员,在这些任务中,我正在执行数据库插入操作
有时任务会失败,数据库插入不会发生。这可能是由于超时或JSON解码错误造成的。我想捕捉执行失败的情况
以下是相关代码:
视图.py
def celery_url_filtering(request):
for each_data in dataset:
#each_data is a Json object
res = result.delay(each_data)
while(res.status == 'PENDING'):
pass
return JsonResponse({'ok':'Success'})
@app.task
def result(dataeach_data):
# Parse each_data and do data insertion here
return "Something"
任务。py
def celery_url_filtering(request):
for each_data in dataset:
#each_data is a Json object
res = result.delay(each_data)
while(res.status == 'PENDING'):
pass
return JsonResponse({'ok':'Success'})
@app.task
def result(dataeach_data):
# Parse each_data and do data insertion here
return "Something"
如何在列表中捕获失败的执行?从您的担忧中我可以理解,您希望查看“挂起”或“失败”任务,并重试/应用某些应用程序逻辑 如果是这样的话,您可以根据需要让cron以固定的时间表、每天/每小时等运行。此cron作业可以根据您的计划捕获在最后一天/小时内失败的任务 可以使用Django ORM设置cron作业和存储芹菜任务结果 例如,你可以做这样的芹菜任务
from celery import shared_task
from django_celery_results.models import TaskResult
**tasks.py**
@shared_task(name="failed_task_cron", bind=True)
def failed_task_cron(self, **kwargs):
"""
Celery task to run on daily schedule to do something with the failed tasks
"""
tasks = TaskResult.objects.filter(status='FAILURE')
# tasks is a queryset of all the failed tasks
# Perform application logic
您可以在芹菜设置中为上述任务设置cron
from celery.schedules import crontab
# ...
CELERY_BEAT_SCHEDULE = {
"failed_task_cron": {
"task": "path/to/tasks.failed_task_cron",
"schedule": crontab(hour=1) # Runs every hour
}
}
你为什么不在任务中处理这些错误?@DejanLekic,这些错误是随机的,因此无法追踪我在上面问题中提到的根本原因,如果我在每个任务中插入的数据由于JsonDecode错误而失败,芹菜会将其归类为失败任务吗???任何导致芹菜任务无法完成的事情,将导致出现故障状态。您可以尝试使用shell检查相同的内容。现在,假设我不想实现crontab,因此,我将在views.py中的函数中的JsonResponse()前面打印这一行“TaskResult.objects.filter(status='FAILURE'),如问题所示。。。。。。它会打印失败的任务吗?它会。所有任务的Queryset失败。但随着时间的推移,这可能是一个需要管理的庞大集合!如果你正在为这些任务做一些处理,那么最好在一段时间内继续摆脱它们。因此,cron工作应运而生。