Celery查看任务执行状态

使用AsyncResult就可以通过id找对应任务的执行状态了

from celery.result import AsyncResult
task = AsyncResult("your-task-id")
status = task.status

但是看stackoverflow第二个回答,确实也是我的一大问题,如果在执行状态还是显示PENDING。另外如果task_id根本找不到,celery也是返回PENDING的。作者说的是要有一个独立于Celery的存储,我这边是使用了MongoDB存储各个任务id,然后成功或者失败的话再根据对应id去更新你的数据库。

最后的restful服务写法如下:

from flask import Flask
from flask_restful import Resource, reqparse, Api
from gevent import pywsgi

flask_app = Flask(__name__)
flask_app.config.update(RESTFUL_JSON=dict(ensure_ascii=False))  # flask config change unicode to chinese
flask_api = Api(flask_app)

class TaskResultGet(Resource):
    def get(self):
        return self.post()

    def post(self):
        result = {'response': {}}
        parser = reqparse.RequestParser(bundle_errors=True)
        parser.add_argument('task_id', type=str, required=True)
        args = parser.parse_args(strict=False)

        task = get_task(args['task_id'])   # get task from mongodb

        if len(task) == 0:
            result['response']['success'] = 0
            result['response']['msg'] = 'TASK NOT FOUND'
        else:
            result['response']['success'] = 1
            database_task_status = task[0]['task_status']

            if database_task_status is not None:
                if database_task_status == 'SUCCESS':
                    result['response']['msg'] = database_task_status
                    result['response']['details'] = task[0]['result']
                elif database_task_status == 'FAILURE':
                    result['response']['success'] = 0
                    result['response']['msg'] = database_task_status
                    result['response']['details'] = task[0]['result']
            else:
                celery_task_status = AsyncResult(args['task_id']).status  # get task status from celery
                result['response']['msg'] = celery_task_status
                if celery_task_status == 'PENDING':
                    result['response']['msg'] += ',' + get_all_type_pending_tasks(args['task_id'])  # show the tasks in front of this task
        return result'
    
flask_api.add_resource(TaskResultGet, '/get_task_result')

if __name__ == '__main__':
    port_id = 8470
    app_server = pywsgi.WSGIServer(('', port_id), flask_app)
    print('restful server start, open port ' + str(port_id) + ' ...')
    app_server.serve_forever()
### 回答1: 如果要终止 Celery 任务并保存状态,您可以使用 Celery 的 revoke 功能。revoke 允许您在任务正在运行时终止它,并且可以选择在任务完成前将其当前状态存储起来。 使用 revoke 的方法是: 1. 获取要终止的任务的 task ID。 2. 使用 Celery 的 control API 调用 revoke 方法,并将任务的 task ID 作为参数传递。 3. 如果您希望保存任务状态,可以在调用 revoke 方法时将 terminate=True 作为参数传递。 例如: ``` from celery.task.control import revoke task_id = 'task-id-of-the-task-to-revoke' revoke(task_id, terminate=True) ``` 请注意,当您终止任务并保存状态时,可能会遇到一些困难,因为您正在试图在任务未完成时存储它的状态。因此,您可能需要对任务进行一些特殊的设计,以便在任务被终止时正确处理和存储状态。 ### 回答2: Celery是一个Python编写的分布式任务队列系统,可以用于处理异步任务。在Celery中,用于终止任务并保存状态的功能是通过调用Celery提供的Task类方法来实现的。 要终止一个任务并保存其状态,可以使用Task类的revoke方法。revoke方法接受一个task_id参数,用于指定要终止任务的ID。 首先,需要获取要终止任务的ID。在Celery中,每个任务都有一个唯一的ID。这个ID可以通过调用异步任务的apply_async方法获取。apply_async方法返回一个AsyncResult对象,其中包含任务的ID。 接下来,可以调用revoke方法来终止任务并保存其状态。revoke方法接受一个task_id参数,用于指定要终止任务的ID。调用revoke方法后,Celery会将任务状态设置为REVOKED,并将其保存在数据库中,以便后续查询。 下面是一个示例代码: from celery import Celery app = Celery('myapp') # 定义一个异步任务 @app.task def my_task(arg1, arg2): # 任务的具体逻辑代码 ... # 调用异步任务 result = my_task.apply_async(args=(1, 2)) # 获取任务的ID task_id = result.id # 终止任务并保存状态 app.control.revoke(task_id, terminate=True) 通过以上代码,可以终止一个任务并保存其状态。当调用revoke方法后,任务状态将被设置为REVOKED,并可以通过Celery提供的查询方法查询任务状态。 ### 回答3: Celery是一个基于Python的分布式任务队列,在处理大规模并发任务时非常有用。在某些情况下,我们可能需要终止正在运行的Celery任务,并保存它们的状态。下面是一种可以实现该功能的方法: 首先,我们可以使用Celery提供的task_id来表示每个任务的唯一标识符。当我们想要终止任务时,可以通过这个任务ID来获取正在运行的任务实例。 然后,我们可以使用`app.control.revoke`方法来终止指定的任务。这个方法接受一个任务ID作为参数,并将任务任务队列中移除。这样,任务就不会继续执行。 一旦任务被终止,我们可以使用一些方法来保存任务状态。例如,我们可以将任务的当前进度和其他相关信息存储到数据库或者其他持久化存储中。这样,即使任务被终止,我们仍然可以通过读取这些状态信息来了解任务的进展情况。 需要注意的是,终止任务并保存状态可能会有一些潜在的问题。例如,如果任务正在执行一些不可撤销的操作或者已经修改了任务所操作的数据,那么即使终止了任务,也无法回滚这些操作。因此,在终止任务之前,我们需要仔细考虑任务执行环境和可能产生的影响。 总而言之,通过使用Celery的task_id和`app.control.revoke`方法,我们可以终止运行中的Celery任务,并保存任务状态。这样,我们可以随时查看任务的进展情况,并在需要的时候采取适当的措施。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值