1.非同步框架示意圖
2.celery 官方文件
3.啟動celery的命令
啟動 sender
自動檢測
啟動worker
自動檢測
4.broker和backend
broker(任務儲存)和backend(結果儲存)都是用的是rmq,backend中的資料會有自動過期機制,1小時後結果將自動過期(可以任意修改)。
5.架構設計
1.傳送任務
所有的複雜邏輯都在傳送端進行處理,將需要執行的任務序列確定好後,放入rmq中,不考慮在rmq上有什麼複雜操作。 暫時只用乙個docker,將所有的非同步任務都放到rmq中。
2.執行任務
執行任務只是簡單的執行具體的函式比如傳送郵件之類,從rmq 中獲取到該worker相對應的任務直接執行,邏輯較為簡單。可以根據任務的數量動態的增減docker的數目。一類任務是乙個task.py檔案,相當於任務之間相互隔離,每個worker只執行特定的一種任務。
3.獲取任務結果
提交任務後會返回任務的唯一id,需要主動去根據任務id獲取執行結果。要把任務id和一些必要資訊存在mysql中。檢查邏輯應該跟具體任務來設計,會關聯到不同的事件。
傳送郵件任務
1.celery的配置
1.1beat端
啟動命令
python
# 啟動timed 命令
celery -a mtk_celery.cel worker -l info -c 1 -q timed
# 啟動job 命令
celery -a mtk_celery.cel worker -l info -q job
# 啟動beat命令
celery -a mtk_celery.cel beat -l info
# celery 路由設定
# -c 指定 worker 數目
# -q 指定 佇列型別
# 需要啟動兩種不同的執行者 timed 型別 只能啟動乙個worker , job 型別沒有限制
celery路由相當於給不同任務分組,給不同型別的任務指定不同的queue,啟動時帶上引數q,該worker,會只完成該queue中的非同步任務
task_routes = ,
'mtk_celery.edm_timed': ,
'mtk_celery.edm_jobs':
}celery定時任務 配置
python
# 定義定時任務
beat_schedule =
}# 將定時任務加入beat中
cel.conf.update(
result_expires=3600 * 2,
beat_schedule=beat_schedule,
task_routes=task_routes
)2.worker端
2.1 timed端
將需要執行的任務指定在配置中,啟動beat 即可,timed 會捕獲到該任務進行執行,由於會有併發衝突,可能會讀取到同乙個edm,所以單獨拆分出來,該worker只擁有乙個,保證不會出現執行緒不安全問題。
2.2 send端
不存在併發執行緒不安全問題,直接啟動多個處理端傳送即可。
celery 非同步任務佇列
celery是基於python開發的分布式任務佇列。它可以讓任務的執行完全脫離主程式,甚至可以被分配到其他主機上執行。我們通常使用它來實現非同步任務 async task 和定時任務 crontab 它的架構組成如下圖 celery 4.x以上版本不安裝該模組,新增任務時會報錯 使用celery包含...
非同步任務 celery傳送郵件
安裝兩個python包 pip install celery 3.1.25 pip install django celery 3.1.17 在配置檔案settings.py中做如下配置 a 首先註冊應用djcelery並做如下配置。import djcelerydjcelery.setup loa...
celery非同步,延時任務, 週期任務
celery中文譯為芹菜,是乙個分布式任務佇列.是非同步的,所以能處理大量訊息 最新的celery不支援windows下使用了,所以在使用pycharm安裝celery模組之後,需要再安裝eventlet模組才能測試執行.啟動客戶端 s1,s2要在專案目錄下,如果在資料夾中執行,terminal輸入...