最近有應用需要部署到不同的伺服器上執行,但是有沒有pbs這樣的排程系統,就想起來python的排程神器 celery。現在針對我的實際應用做一些記錄。
因為我並不注重結果而是把命令拿到不同的機器上執行,所以訊息**和結果儲存我都選擇了 redis
# 只需要在一台伺服器上安裝 redis,其他伺服器均使用該伺服器redis即可
sudo apt-get install redis-server
# 所有伺服器都要安裝以下python package
sudo pip install celery
sudo pip install redis
當然也可以選擇虛擬環境安裝python包。
目錄下含有
tasks.py
test.py
test_dir
配置程式 celeryconfig.py(也可以把配置程式寫到主程式內部)
# coding: utf-8
# celeryconfig.py
# 配置訊息**和結果儲存資料庫,均使用redis,當然也可以使用rabbitmq
broker_url = 'redis:'
result_backend = 'redis:'
# 客戶端與消費者(worker)直接傳輸資料的序列化方式
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
enable_utc = true
# 設定worker從訊息**處獲取的任務數目,因為我執行的程式比較耗io,而且不同的任務耗時不同,所以每次只分給乙個機器乙個任務
celery_acks_late = true
worker_prefetch_multiplier = 1
主程式 tasks.py(worker設定)
import sys
from celery import celery
defrun
(cmd):
print('runing: %s' % cmd)
print(os.uname()) # 列印機器名,可以判斷在哪台機器上執行
# 這個任務僅僅是執行shell命令
os.system(cmd)
啟動worker
這裡需要在執行的機器上均執行一下命令,啟動各自的worker
# 方法1
celery worker -a tasks -l info
# 這裡的tasks 指的就是 tasks.py
# 這種方式啟動worker,會一直占用視窗,不方便
# 方法2,採用multi方式啟動
celery multi start -a tasks worker --loglevel=info --autoscale=5,2 --pidfile=/your/path/celery_%n.pid --logfile=/your/path/celery_%n.log
# --pidfile 儲存該celery的程序id
# --logfile 儲存celery的日誌資訊
# 涉及的 %n 表示只包含主機名, 其他還有:
# %h 包含網域名稱的主機名
# %d 只包含網域名稱
# --autoscale 可以支援程序設定
# 5,2 表示 每個機器程序池平時保持2個程序,最大併發數為5個
測試test.py
from tasks import run
for ii in range(20):
run.delay('touch test_dir/test_%s' % ii)
# 這裡的命令是在test_dir目錄下建立20個檔案
# 這裡使用 delay 屬性,可以把需要執行的命令加入到訊息佇列,在各個機器上執行
執行test.py, 只需要在一台機器上執行,即可分布到其他機器執行。 celery實現分布式
worker執行在不同的機器上,每台機器上有多個task程序 worker執行的時候連線到broker,在控制機器上 任務發布節點 直接向broker傳送任務,只要建立乙個broker,在不同的機器上執行celery worker。框架圖 task.py coding utf 8 from cele...
分布式佇列 Celery
詳情參見 分布式佇列神器 celery 2 celery 4.1 使用者指南 task 任務 3 celery 4.1 使用者指南 calling tasks 呼叫任務 4 celery 4.1 使用者指南 canvas designing work flows 設計工作流程 5 celery 4....
celery分布式使用
celery包含如下元件 1.celery beat 任務排程器,beat程序會讀取配置檔案的內容,周期性地將配置中到期需要執行的任務傳送給任務佇列 一般用於定時任務使用 2.celery worker 執行任務的消費者,通常會在多台伺服器執行多個消費者來提高執行效率。3.broker 訊息 或者叫...