Python & Celery 学习笔记_删除任务

这篇文章主要是在记录,celery 的任务状态以及该如何删除在任务伫列中的任务
有问题欢迎留言讨论喔!!

一、Celery 中的任务状态

Celery 内部对於任务的状态有 PENDING、STARTED、SUCCESS、FAILURE、RETRY、REVOKED,然而,笔者这边不推荐直接读取 Celery Backend 的状态,因为不见得符合每个任务的需求,最好的方式是针对每个任务,撰写一套任务的模组、状态以及相对应的 CRUD,会更加体现不同任务的状态,下面简单针对各个状态做一些定义

  1. PENDING -> 任务正在等待执行或未知,任何未知的任务 ID 都默认处於 PENDING
  2. STARTED -> 任务已经开始,在 Celery Backend 中,默认不会记录,需要另外启用
  3. SUCCESS -> 任务执行成功
  4. FAILURE -> 任务执行失败
  5. RETRY -> 任务处於重试状态
  6. REVOKED -> 任务取消

二、取消任务

我们可以利用 celery 提供的控制模组来对任务进行控制,举凡观察、停止等,下面简单介绍该如何将任务进行取消

  1. 建立任务 (task.py)
import datetime
from celery import Celery
from setting import broker_url, backend_url


app = Celery("celery_start", broker=broker_url, backend=backend_url)


@app.task
def get_time(name: str):
    return f"Hello {name}, today is {datetime.datetime.now().isoformat()}"
  1. 利用程序送出任务
    说明: Celery 在送出任务後,会回传一个任务的类别,里面包含了 Celery 会存在本身 Backend 的一些资讯,例如 id、result、states...... 等等,而取消任务会需要用到 id
from task import get_time, app

# 送出任务
test_task = get_time.apply_async(("nick",), countdown=60)
  1. import Control 模组,实作并利用 revoke 方法
import time
from task import get_time, app
from celery.app.control import Control

# 送出任务
test_task = get_time.apply_async(("nick",), countdown=60)

time.sleep(5)

control_obj = Control(app)  # 记得要将 celery 物件带入
control_obj.revoke(task_id=test_task.id)

可以看到 celery 在收到 revoke 指令後,会先将任务标记为 revoke,在 countdown or eta 到期後,才会正式将该任务删除
https://ithelp.ithome.com.tw/upload/images/20220316/20144024tIDahNN6l3.jpg

若想直接删除任务可以加上 terminate=True 参数,这个指令也可以强制关闭正在执行的任务,然而这个指令似乎只会在 linux 系统上产生作用,於 windows 上并没有任何作用,若不幸的任务已经开始执行,只能等待任务执行完毕或手动强制关闭,才会停止

control_obj.revoke(task_id=test_task.id, terminate=True)

<<:  【JavaScript】阵列与常用的四种新增删除方法

>>:  11. STM32-SPI Nokia 5110 LCD 实作

[Day26] 建立购物车系统 - 9

本篇同步发文在个人Blog: 一袋.NET要扛几楼?打造容器化的ASP.NET Core网站!系列文...

Day 20 - React.memo

如果有错误,欢迎留言指教~ Q_Q 没写完啦 子元件通常会接收父元件的 state 或 event...

实验 Spring boot 将 Log 传给 EFK

这一篇的实验室透过 docker-compose 中 logging 关键字将应用程序 log 转发...

[Day 05] Sass - Variables

Variables 在Sass中,开发者可以使用变数,例如可以将常用的颜色、宽度设定成变数,这样未来...

【JavaScript】在JavaScript中使用switch(true)

开发专案时,在其中的某个环节,想说除了switch之外,是否有更好的写法,上网一查发现,还有swit...