Python & Celery 学习笔记_周期任务 (Beat)

这篇文章主要在说明,该如何使用 celery 定期执行任务,基本上来说,beat config 的设定都长得差不多,只是分为以秒为单位执行以及定时执行两种方式

一、beat config 的设定

这边先进行以秒为单位设定的方法:

  1. 汇入模组
  2. 建立 celery 物件
  3. 设定 beat config
  4. 建立任务
from celery import Celery
from setting import broker_url, backend_url
from datetime import datetime


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

app.conf.beat_schedule = {
    'do-every-60-seconds': {
        'task': 'celery_beat.get_time',
        'schedule': 60.0,
        'args': ("nick",)
    }
}


@app.task
def get_time(name: str):
    now = datetime.now()

    return f"Hello {name} 现在时间为 {now.strftime('%Y-%m-%d, %H:%M:%S')}"

简单说明一下 config 的组成

app.conf.beat_schedule = {
    '<beat 本身的任务名称>': {
        'task': '<module_name>.<task_name>',
        'schedule': <float>,  # 单位为秒 ex: 60.0 即 60 秒
        'args': ("nick",)  # 送进任务中的参数
    }
}

二、如何启动 beat

在 windows 上,必须透过两行指令来启动 beat,下面是在 pycharm 执行,因此直接将同个 terminal 切成两个 session 来执行,後面会补充该如何在 linux 相关系统上利用一行指令同时启动 worker 和 beat

  1. 透过下面的指令来启动 celery worker
celery -A <module_name> worker -l info -P gevent
  1. 透过下面的指令来启动 celery beat
celery -A <module_name> beat -l info
  1. 下面两行指令为本专案启动的指令
celery -A celery_beat worker -l info -P gevent
celery -A celery_beat beat -l info

附注: 建议先启动 worker,再启动 beat 才不会造成有些微的时差

下面两张图分别为 worker 以及 beat 执行的结果截图

  1. worker
    https://ithelp.ithome.com.tw/upload/images/20220314/20144024mByOA3BJqu.jpg
  2. beat
    https://ithelp.ithome.com.tw/upload/images/20220314/20144024oEY7kRoQgu.jpg

三、Crontab

透过 crontab 可以帮助我们设定任务在指定的时间执行,范例如下

from celery import Celery
from setting import broker_url, backend_url
from datetime import datetime
from celery.schedules import crontab


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

app.conf.beat_schedule = {
    'add-every-monday-morning': {
        'task': 'celery_beat.get_time',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
        'args': (16, 16),
    },
}

这边附上 官网提供的范例

四、利用一行指令启动 worker 和 beat

下面这个指令可以同时启动 worker 和 beat,但要注意,这会将两者的 log 印在同一个 session,且该指令只能在 linux 系统 (MAC 也可以) 上执行

celery -A <module_name> worker -l info -B

<<:  9. STM32-PWM 呼吸灯(下)

>>:  计算机概论 - 程序语言 Programming Languages

故事二十八:人口密度高的地区,每一户的所得总额是不是也比较高呢?

     最近,有事没事就会逛逛open data的网站,我今天很幸运的看到了两个资料集:分别是 综...

(Day 30) chequered flag

congrats to everyone who managed to finsih 30 days...

赚外快踩到线

境外诈骗集团使用移动式机房的好处 移动式信号追踪难度高於一般固定位置信号 来电显示为台湾电信发号,降...

C# 入门数据类型(补充)

前面我们有简单的介绍了一下数组,后来考虑了一下,还是在这里增加一个补充说明一下。本篇除了说明数组外,...

云端资安之GCP篇(Google Cloud Platform)

你终究要上云端的,那为什麽不一开始就上? 接下来三天是关於三大云端服务, 分别就是GCP(Googl...