iT邦幫忙

0

Python & Celery 學習筆記_週期任務 (Beat)

  • 分享至 

  • xImage
  •  

這篇文章主要在說明,該如何使用 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

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言