Celery分布式應用

2021-08-04 03:55:45 字數 2049 閱讀 2990

最近有應用需要部署到不同的伺服器上執行,但是有沒有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 訊息 或者叫...