这篇文章主要在说明,该如何使用 celery 定期执行任务,基本上来说,beat config 的设定都长得差不多,只是分为以秒为单位执行以及定时执行两种方式
一、beat config 的设定
这边先进行以秒为单位设定的方法:
汇入模组建立 celery 物件设定 beat config建立任务from celery import Celeryfrom setting import broker_url, backend_urlfrom datetime import datetimeapp = 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.taskdef 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
透过下面的指令来启动 celery workercelery -A <module_name> worker -l info -P gevent
透过下面的指令来启动 celery beatcelery -A <module_name> beat -l info
下面两行指令为本专案启动的指令celery -A celery_beat worker -l info -P geventcelery -A celery_beat beat -l info
附注: 建议先启动 worker,再启动 beat 才不会造成有些微的时差
下面两张图分别为 worker 以及 beat 执行的结果截图
worker

三、Crontab
透过 crontab 可以帮助我们设定任务在指定的时间执行,範例如下
from celery import Celeryfrom setting import broker_url, backend_urlfrom datetime import datetimefrom celery.schedules import crontabapp = 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