Celery 和 Redis 入門

來源:互聯網
上載者:User

標籤:

Reference:  http://www.thinksaas.cn/group/topic/395734/

 

Celery是一個廣泛應用於網路應用程式的任務處理系統。

它可以在以下情況下使用:

在請求響應周期中做網路調用。伺服器應當立即響應任何網路請求。如果在請求響應周期內需要進行網路調用,則應在周期外完成調用。例如當使用者在網站上註冊時,需要發送啟用郵件。發送郵件是一種網路調用,耗時2到3秒。使用者應該無需等待這2到3秒。因此,發送啟用郵件應當在請求響應周期外完成,celery 就能實現這一點。

將一個由幾個獨立部分組成的大任務分成多個小任務。假設你想知道臉書使用者的時間流。臉書提供不同的端點來擷取不同的資料。譬如,一個端點用以擷取使用者時間流中的圖片,一個端點擷取使用者時間流中的博文,一個端點得到使用者的點贊資訊等。如果你的函數需要和臉書的5個端點依此通訊,每個網路調用平均耗時2秒,你將需要10秒完成一次函數執行。但是,你可以把這項工作分為5個獨立的任務(你很快就會發現這很容易做到),並讓 celery 來處理這些任務。Celery 可以並行地與這5個端點通訊,在2秒之內就能得到所有端點的響應。

簡單的 celery 例子

假設我們有一個函數,並傳給它一個網址列表。該函數需要擷取這些網址的響應。

沒有使用 celery

建立檔案celery_blog.py

import requestsimport timedef func(urls): start = time.time() for url in urls: resp = requests.get(url) print resp.status_code print"It took", time.time() - start,"seconds"if __name__ =="__main__": func(["http://oneapm.com","http://jd.com","https://taobao.com","http://baidu.com","http://news.oneapm.com"])

運行:

python celery_blog.py

輸出: 

使用 celery

調用 celery 的程式中最重要的組成部分為 celery worker。

在 web 應用程式註冊的例子中,celery worker 用於發送郵件。

在臉書的例子中, celery worker 用於擷取不同的網址。

在我們的celery_blog.py 例子中, celery worker 用於擷取 URL。 celery worker 和你的應用程式/指令碼是不同的進程,彼此獨立運行。所以你的應用程式/指令碼和 celery 需要一些方法來相互溝通。

應用程式代碼需要把任務放在 celery worker 可以取出並執行的位置。譬如,應用程式代碼將任務放在訊息佇列中,celery worker 從訊息佇列領取任務並執行任務。我們將使用 Redis 作為訊息佇列。

請確認你已安裝 Redis,並可以運行redis-server

請確認你已安裝 celery。

修改檔案celery_blog.py,如下:

from celery import Celeryapp = Celery(‘celery_blog‘,broker=‘redis://localhost:6379/1‘)@app.taskdef fetch_url(url): resp = requests.get(url) print resp.status_codedef func(urls): for url in urls:fetch_url.delay(url)if __name__ =="__main__": func(["http://oneapm.com","http://jd.com","https://taobao.com","http://baidu.com","http://news.oneapm.com"])

代碼解釋:我們需要一個 celery 執行個體來啟動程式,因此建立了一個名為 app 的 celery 執行個體。

在3個終端中啟動:

第一個終端,運行redis-server

第二個終端,運行celery worker -A celery_blog -l info -c 5 ,通過輸出可以看到 celery 成功運行。

第三個終端,運行指令碼python celery_blog.py

可以看到第二個終端輸出如下:

將 celery 代碼和配置儲存在不同檔案中

上面的例子中,我們唯寫了一個 celery 任務。但您的項目可能涉及多個模組,您可能希望在不同的模組中有不同的任務。所以讓我們將 celery 配置移到單獨的檔案中。

建立celery_config.py

from celery import Celeryapp = Celery(‘celery_config‘, broker=‘redis://localhost:6379/0‘, include=[‘celery_blog‘])

修改celery_blog.py代碼如下:

import requestsfrom celery_config import app@app.taskdef fetch_url(url): resp = requests.get(url) print resp.status_codedef func(urls): for url in urls:fetch_url.delay(url)if __name__ =="__main__": func(["http://oneapm.com","http://jd.com","https://taobao.com","http://baidu.com","http://news.oneapm.com"])

停掉之前的celery worker,運行:

celery worker -A celery_config -l info -c 5

開啟 ipython ,運行如下命令:

In [1]: from celery_blog import funcIn [2]: func(["http://oneapm.com","http://jd.com","https://taobao.com","http://baidu.com","http://news.oneapm.com"])

輸出如下:

在不同檔案中添加新的任務

您可以添加新的模組,並在該模組中定義一個任務。用以下內容建立一個模組celery_add.py

from celery_config import app@app.taskdef add(a, b): return a + b

改變celery_config.py包含新的模組celery_add.py,如下:

from celery import Celeryapp = Celery(‘celery_config‘, broker=‘redis://localhost:6379/0‘, include=[‘celery_blog‘, ‘celery_add‘])

在 ipython 輸入:

In [1]: from celery_add import addIn [2]: add.delay(4, 5)

輸出如下:

在不同的機器上分開使用 Redis 和 celery

到目前為止,我們的指令碼、celery worker 和 Redis 都運行在同一機器中。其實並無這種必要,這三者可以運行在不同機器上。

celery 任務涉及到網路請求,因此,在網路最佳化的機器上使用 celery worker 能提高任務運行速度。Redis 是一種記憶體資料庫,在記憶體最佳化的機器上運行效率更高。

在這個例子中,我將在本地系統運行指令碼和 celery worker,在分開的伺服器上運行 Redis。

修改celery_config.py為:

app = Celery(‘celery_config‘, broker=‘redis://192.168.118.148:6379/0‘, include=[‘celery_blog‘])

現在我運行任何任務,指令碼都將把他放在 Redis 啟動並執行伺服器(192.168.118.148)上面。

celery worker 也與 192.168.118.148 溝通,在這個 Redis 伺服器上得到任務並執行它。

注意:您必須使用正在運行 redis-server 的伺服器位址。我的伺服器已停止Redis,所以你將無法串連到 Redis。

參考文章:Getting started with Celery and Redis

Celery 和 Redis 入門

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.