爲什麼使用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視頻