Django --- celery異步任務與RabbitMQ模塊

一 RabbitMQ 和 celery


1 celery

Celery 是一個 基於python開發的分佈式異步消息任務隊列,經過它能夠輕鬆的實現任務的異步處理, 若是你的業務場景中須要用到異步任務,就能夠考慮使用celerypython

celery 異步處理須要傳遞消息和存儲結果,傳遞消息的叫 Broker(消息中間件),存儲結果的叫 backendweb


(1) celery使用場景:redis

1 web應用。當用戶觸發的一個操做須要較長時間才能執行完成時,能夠把它做爲任務交給celery去異步執行,執行完成後再返回給用戶。

2 定時任務。生產環境常常會有一些定時任務。

3 其餘能夠異步執行的任務。好比發送消息/ 郵件、推送消息、清理/設置緩存等


(2) celery的broker:django

Celery 在執行任務時須要經過一個**消息中間件**來接收和發送任務消息,以及存儲任務結果, 通常使用rabbitMQ or Redis;

celery 消息的解決方案默認使用 amqp 協議(即 RabbitMQ),能夠在配置中指定其餘的消息解決方案


(3) Celery 定時任務:緩存

Celery 定時任務-- celery beat(django也可使用)

啓動celery beat 和worker,實現隔一段時間,beat會發起一個任務消息讓worker執行任務


2 RabbitMQ

RabbitMQ是一個在AMQP基礎上完整的,可複用的企業消息系統。他遵循Mozilla Public License開源協議。服務器

MQ全稱爲Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通訊方法。

應用程序經過讀寫出入隊列的消息(針對應用程序的數據)來通訊,而無需專用鏈接來連接它們。

消息傳遞指的是程序之間經過在消息中發送數據進行通訊,而不是經過直接調用彼此來通訊,直接調用一般是用於諸如遠程過程調用的技術。

排隊指的是應用程序經過隊列來通訊。隊列的使用除去了接收和發送應用程序同時執行的要求。

RabbitMQ做爲一個消息隊列管理工具被引入到和Celery集成,負責處理服務器之間的通訊任務app

RabbitMQ安裝異步

安裝配置epel源
   $ rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
 
安裝erlang
   $ yum -y install erlang
 
安裝RabbitMQ
   $ yum -y install rabbitmq-server

注意:service rabbitmq-server start/stop

安裝API分佈式

pip install pika
or
easy_install pika
or
源碼
 
注意: celery 不是使用的pika,而是本身實現的,維護的「amqp」包
https://pypi.python.org/pypi/pika

基於內存隊列的,queue 消息隊列(生產者消費者模型)函數

import Queue
    import threading
    
    
    message = Queue.Queue(10)
    
    
    def producer(i):
        while True:
            message.put(i)
    
    
    def consumer(i):
        while True:
            msg = message.get()
    
    
    for i in range(12):
        t = threading.Thread(target=producer, args=(i,))
        t.start()
    
    for i in range(10):
        t = threading.Thread(target=consumer, args=(i,))
        t.start()

而 RabbitMQ, 生產和消費再也不針對內存裏的一個Queue對象,而是某臺服務器上的RabbitMQ Server實現的消息隊列。


RabbitMQ的幾個概念

1 Queue(隊列)是RabbitMQ的內部對象,用於存儲消息。

2 Channel是與RabbitMQ打交道的最重要的一個接口,咱們大部分的業務操做是在Channel這個接口中完成的,包括定義Queue、定義Exchange、綁定Queue與Exchange、發佈消息等。

3 exchange:生產者不是將消息直接放到queue(隊列)中,而是先到exchange中,exchange主要用於控制消息到隊列的路由,根據具體的exchange type將消息傳給須要的隊列或者直接廢棄。

    ExchangeType有fanout、direct、topic、headers這四種,不一樣的類型有着不一樣的路由策略

二 django-celery 模塊的使用


1 提升網站請求速度的方法

提升網站的請求速度,提升 用戶 體驗 

 1 緩存

 2 不能緩存的 任務能夠提交 celery 異步執行

2 原理:

開一個新的進程(也能夠加定時任務)
    處理耗時的操做


任務---函數--task
隊列 queue 存儲多個耗時操做
worker 負責執行renwu
broker 負責調度

3 使用 :

安裝

pip install celery
pip install celery-with-redis
pip install django-celery


配置:

    install_apps = {
    '''
    'djcelery'
    }

    import djcelery

    djcelery.setup_loader()![](https://images2018.cnblogs.com/blog/1220788/201803/1220788-20180328215633011-1420381525.png)

    BROKER_URL = 'redis://127.0.0.1:6379/0'
    CELERY_IMPORTS = ('應用名稱.task')

在應用目錄下建立 task.py文件

    import time
    from celery import task

    @task
    def sayhello():

        print('hello...')
        time.sleep(0.5)
        print('world...')


遷移 生成celery的數據表

    python manage.py migrate

啓動 redis

調用 worker

    python manage.py celery worker --loglevel=info

調用函數

    function.delay()

相關文章
相關標籤/搜索