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工作应运而生。