Python異步任務celery的使用,celery分佈式隊列管理工具 | celery定時任務

爲什麼使用celery

在實際的開發過程中經常會出現一些耗時操作,或者一些定時操作,比如定時短信、郵件、定時清理等等… 所以使用celery是一個很好的選擇。

celery是什麼

celery是用來處理大量信息的分佈式系統,同時提供了操作和維護分佈式系統做需要的分佈式工具,簡單來說,celery就是一個管理分佈式隊列的工具。
celery本身不是任務隊列,知識一個分佈式管理工具,內部封裝了各種的隊列操作,使用celery可以更方便快捷的管理任務隊列。

環境

celery == 3.1.25
redis == 2.10.0

eg1 最簡單celery的使用案例

一、創建一個tasks.py文件,

import time
from celery import Celery

backend = 'redis://localhost:6379/0'
broker = 'redis://localhost:6379/0'
# 創建celery對象
app = Celery('task_add', backend=backend, broker=broker)

# 創建celery任務
@app.task(name='number_add')
def number_add(x, y):
    time.sleep(4)
    print('number_add 進來了...')
    return x + y

二、創建test.py文件用來執行celery任務

# 我的tasks.py test.py文件都是在celery_task文件夾中
from celery_task.tasks import number_add

# 調用方法
if __name__ == '__main__':
    print('start task...')
    # 調用delay方法開啓任務
    result = number_add.delay(3, 5)
    print('end task...')
    # 拿到任務結果
    num = result.get()
    print(num)

三、開啓celery,等待任務執行

# -A 後面指定任務就是tasks.py,後面的路徑--workdir ./celery_task,根據自己的文件修改,執行的命令在同一文件下可以不要
celery worker -A tasks -l INFO --workdir ./celery_task

在這裏插入圖片描述
看到這個界面說明celery執行成功。
四、執行任務,
執行test.py裏面的代碼,可以看到輸出結果。

eg2 模塊化celery任務

首先看一下目錄結構:
在這裏插入圖片描述
一、__init __.py初始化文件


from celery import Celery
# 任務名稱demo
app = Celery('demo')
# 通過celery實例加載配置模塊,配置信息在celeryconfig.py文件中
app.config_from_object('celery_task.celeryconfig')

二、celeryconfig.py配置文件


BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
# 時區
CELERY_TIMEZONE = 'Asia/Shanghai'

# 導入指定的任務模塊
CELERY_IMPORTS = (
    'celery_task.tasks'
)

三、tasks.py任務管理,
和上面的task.py文件內容一致,這裏app是導入的不是創建的

# 模塊化之後
from celery_task import app

@app.task
def number_add(x, y):
    time.sleep(4)
    print('number_add 進來了...')
    return x + y

四、tast.py文件,用來執行任務

# 模塊化之後
from celery_task import tasks

# 調用方法
if __name__ == '__main__':
    print('start task...')
    result = tasks.number_add.delay(3, 5)
    print('end task...')
    num = result.get()
    print(num)

五、celery啓動命令
這裏與上面的命令不一樣

# celery_task:是celery_task.py文件,
# 這裏沒有指定路徑,因爲命令是在celery_task.py文件父目錄下執行的,所以不用指定。
celery worker -A celery_task -l INFO

六、運行test.py文件代碼

celery定時任務

將上面的配置文件celeryconfig.py中增加如下代碼:

# celeryconfig.py

# 定時任務
CELERYBEAT_SCHEDULE = {
    # 任務一,每10秒指定一次
    'task_1': {
        # 指定任務
        'task': 'celery_task.tasks.number_add',
        # 每十秒執行一次
        'schedule': timedelta(seconds=10),
        # 參數
        'args': (3, 6)
    },
    # 任務二,定時執行,每天固定時間執行
    'task_2': {
        # 指定任務
        'task': 'celery_task.tasks.number_mult',
        # 每天執行
        'schedule': crontab(hour=18,minute=31),
        # 參數
        'args': (3, 6)
    }
}

還要在tasks.py中增加一個任務方法:

# tasks.py

@app.task
def number_mult(x, y):
    print('定時-乘法')
    return x * y

這裏提醒一下celery==4.10版本的每天的定時任務可能有bug,請使用其他版本。
執行celery啓動命令:
兩條命令

celery worker -A celery_task -l INFO
# celery beat是用來開啓定時任務調度的
celery beat -A celery_task -l INFO

詳細的定時任務代碼請看:Python異步任務celery,celery定時任務,定時發送郵件、短信、執行清理等等

參考資料:
celery-分佈式隊列管理工具
官方文檔
celery視頻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章