celery簡單應用


寫作背景介紹

celery簡單入門中已經介紹了寫作的背景,這篇文章主要是深入介紹celery的使用技巧。在實際的項目中我們需要明確前后台的分界線,因此我們的celery編寫的時候就應該是分成前后台兩個部分編寫。在celery簡單入門中的總結部分我們也提出了另外一個問題,就是需要分離celery的配置文件。

第一步

編寫后台任務tasks.py腳本文件。在這個文件中我們不需要再聲明celery的實例,我們只需要導入其task裝飾器來注冊我們的任務即可。后台處理業務邏輯完全獨立於前台,這里只是簡單的hello world程序需要多少個參數只需要告訴前台就可以了,在實際項目中可能你需要的是后台執行發送一封郵件的任務或者進行復雜的數據庫查詢任務等。

import time
from celery.task import task


@task
def say(x,y):
        time.sleep(5)
        return x+y

第二步

有了那么完美的后台,我們的前台編寫肯定也輕松不少。到底簡單到什么地步呢,來看看前台的代碼吧!為了形象的表明其職能,我們將其命名為client.py腳本文件。

from celery import Celery

app = Celery()

app.config_from_object('celeryconfig')
app.send_task("tasks.say",['hello','world'])

可以看到只需要簡單的幾步

  1. 聲明一個celery實例。
  2. 加載配置文件。
  3. 發送任務

第三步

讓我們完成celery的配置吧!官方的介紹使用celeryconfig.py作為配置文件名,這樣可以防止與你現在的應用的配置同名。

CELERY_IMPORTS = ('tasks')
CELERY_IGNORE_RESULT = False
BROKER_HOST = '127.0.0.1'
BROKER_PORT = 5672
BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp'

可以看到我們指定了CELERY_RESULT_BACKENDamqp默認的隊列!這樣我們就可以查看處理后的運行狀態了,后面將會介紹處理結果的查看。

第四步

啟動celery后台服務,這里是測試與學習celery的教程。在實際生產環境中,如果是通過這種方式啟動的后台進程是不行的。所謂后台進程通常是需要作為守護進程運行在后台的,在python的世界里總是有一些工具能夠滿足你的需要。這里可以使用supervisor作為進程管理工具。在后面的文章中將會介紹如何使用supervisor工具。

celery worker -l info --beat

注意現在運行worker的方式也與前面介紹的不一樣了,下面簡單介紹各個參數。

  1. -l info--loglevel=info的作用是一樣的。
  2. --beat 周期性的運行
    運行后可以看到下面這樣的輸出。

第五步

前台的運行就比較簡單了,與平時運行的python腳本一樣。

python client.py

此時應該是什么也沒有看到,腳本也沒有返回任何數據。運行后立即結束,這是正常的。我們看到后台會發現已經輸出了一些數據,這些內容應該大致是顯示如下信息。

現在前台的任務是運行了,可是任務是被寫死了。我們的任務大多數時候是動態的,為演示動態工作的情況我們可以使用終端發送任務。

python終端導入celery模塊聲明實例然后加載配置文件,完成了這些步驟后就可以動態的發送任務並且查看任務狀態了。注意在配置文件celeryconfig.py中我們已經開啟了處理的結果回應模式了CELERY_IGNORE_RESULT = False並且在回應方式配置中我們設置了CELERY_RESULT_BACKEND = 'amqp'這樣我們就可以查看到處理的狀態了。

從圖中,我們可以看到任務發送給celery后馬上查看任務狀態會處於PENDING狀態。稍等片刻就可以查看到SUCCESS狀態了。這種效果真棒不是嗎?在圖像處理中或者其他的一些搞耗時的任務中,我們只需要把任務發送給后台就不用去管它了。當我們需要結果的時候只需要查看一些是否成功完成了,如果返回成功我們就可以去后台數據庫去找處理后生成的數據了。

總結

現在我們的celery看起來有模有樣了,不過我們的結果並沒有保存在我們最喜歡的數據庫中。大多時候我們都希望計算結果能夠保存在一個常規數據庫中而不是消息隊列中,那么celery應該怎么配置才能把數據保存到數據庫中呢?下篇文章我們就使用mongodb保存我們的計算結果吧!讓數據持久化吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM