天天看點

python并發分布式架構Celery搭建

最近項目用到一個好東西,分享給大家,簡單,有效,這就是我的感受!先來個圖

python并發分布式架構Celery搭建

Celery的架構由三部分組成,消息中間件(message broker),任務執行單元(worker)和任務執行結果存儲(task result store)組成。

消息中間件

Celery本身不提供消息服務,但是可以友善的和第三方提供的消息中間件內建。包括,RabbitMQ, Redis, MongoDB (experimental), Amazon SQS (experimental),CouchDB (experimental), SQLAlchemy (experimental),Django ORM (experimental), IronMQ

最簡單的當屬Redis,5分鐘内搭建好一個并發分布式架構!

任務執行單元

Worker是Celery提供的任務執行的單元,worker并發的運作在分布式的系統節點中。

任務結果存儲

Task result store用來存儲Worker執行的任務的結果,Celery支援以不同方式存儲任務的結果,包括AMQP, Redis,memcached, MongoDB,SQLAlchemy, Django ORM,Apache Cassandra, IronCache

OK 直接來個立即能跑的demo吧。

0、安裝celery/redis

    #yum install redis     #安裝redis消息隊列服務

    #pip install celery     #安裝celery架構

    #pip install redis      #使用redis作為celery的broker時需要安裝redis的python庫(性能和RabbitMQ相當[erlang實作])

1、worker腳本tasks.py

from celery import Celery

import subprocess

brokers = 'redis://127.0.0.1:6379/1'

backend = 'redis://127.0.0.1:6379/2'

app = Celery('tasks', broker=brokers, backend=backend)

@app.task

def shell_popen(cmd):

        proc = subprocess.Popen(cmd, shell=True) #stdout=subprocess.PIPE

        return proc.pid

@app.task

def shell_check_output(cmd):

        return subprocess.check_output(cmd, shell=True)

if __name__ == "__main__":

    app.start()

2、任務建立腳本process.py

from tasks_proxy_requests import rpc_shell_popen

from tasks_proxy_requests import rpc_shell_check_output

cmd="ifconfig"

result = shell_check_output.delay(cmd)

while not result.ready():

       time.sleep(0.01)

out= result.get()

print out

[[email protected] abin]#/usr/bin/celery -A tasks worker --loglevel=info -c 10    #建立10個worker并發,等待任務處理

[[email protected] abin]#./process.py    #顯示print out的結果

    附:Celery異常處理

    celery提示Missing redis library,安裝更新python redis庫

        File "/usr/local/lib/python2.7/site-packages/kombu/connection.py", line 576, in create_transport

            return self.get_transport_cls()(client=self)

        File "/usr/local/lib/python2.7/site-packages/kombu/transport/redis.py", line 1009, in __init__

            raise ImportError('Missing redis library (pip install redis)')

        [[email protected] celery]# pip2.7 install redis --upgrade

        Collecting redis

        Downloading redis-2.10.6-py2.py3-none-any.whl (64kB)

            100% |████████████████████████████████| 71kB 295kB/s 

        Installing collected packages: redis

        Successfully installed redis-2.10.6

要想成為一個出色的程式員,請前往IT搜123 www.itso123.com了解,搜集各種必備網站的程式員導航。