摘要:使用消息來通信,流程為客戶端添加消息到隊列來初始化一個任務,然后消息隊列系統把消息分發給工作進程。可以包含多個工作進程和消息系統,來保證高可用性和進行水平擴展。保存結果可以使用很多例如的,,。
celery是一個簡單的、靈活的、可靠的分布式系統,提供了工具來維護這樣一個系統,用于處理大量的信息(實時信息、定時任務安排),是一個任務隊列,易于使用,易于和其他語言進行配合。
任務隊列任務隊列是一種把任務通過線程或機器進行分發的機制,輸入是一個工作單元--任務,工作進程則不斷地檢查任務隊列來執行新任務。celery使用消息來通信,流程為:客戶端添加消息到隊列來初始化一個任務,然后消息隊列系統把消息分發給工作進程。celery可以包含多個工作進程和消息系統,來保證高可用性和進行水平擴展。
特性簡單,不需要配置文件,高可靠性(工作進程和客戶端在連接丟失或失敗時會自動重試,一些支持HA的消息系統可以做主主、主從擴展),快速(每分鐘處理幾百萬任務,通過使用RabbitMQ librabbitmq 和 一些優化設置),它的每一部分都可以靈活地擴展(自定義的pool,序列化方式,壓縮,日志,周期任務,消費者,生產者),支持的消息隊列系統(redis rabbitmq),支持的結果存儲(django sqlalchemy redis amqp),并發支持(多進程,eventlet gevent,單線程),序列化方式(json pickle yaml msgpack)。
自帶的監控功能,工作流,資源泄露預防,處理速率、運行時間控制
消息隊列rabbitmq 功能完整、穩定、耐用、易安裝,作為生產環境很合適。
redis 也是功能完整的,但是丟失數據的可能性較高,如被停止或停電。
應用需要一個celery實例,即應用。這個應用是使用所有東西的進入點,例如創建任務、管理工作進程,必須可被其他模塊引入。
tasks.py
# coding: utf8 from celery import Celery app = Celery("tasks", broker="pyamqp://guest@localhost//") # 傳入的tasks參數即當前的模塊名稱,broker即為消息隊列的地址 # ampb(RabbitMQ) redis # 下面創建任務 @app.task def add(x, y): return x + y
執行程序,啟動服務器:
celery -A tasks worker --loglevel=info調用
from tasks import add add.delay(4, 4)
現在task是被之前啟動的工作進程來執行,返回值是一個AsyncResult,可以用來判斷任務的狀態、等待該任務執行完畢或是獲得它的返回值。默認是不返回的,需要配置result backend,也可以在工作進程的命令行輸出窗口中看到。
保存結果可以使用很多backend 例如Django的ORM、SQLAlchemy,Redis,RabbitMQ。
app = Celery("tasks", backend="rpc://", broker="pyamqp://") # 這邊使用的backend是RabbitMQ的rpc遠程調用 result = add.delay(4, 4) # 現在就可以獲得返回的result了 result.ready() # 判斷任務是否執行完成 result.get(timeout=1) # 等待任務執行(一般不用) # 如果任務出錯了這邊也會直接獲得異常 或: result.get(propagate=False) # 不拋出 result.traceback # 再獲得異常信息配置
app.conf.task_serializer = "json" # 設置task的序列化方式 # 一次設置很多選項 app.conf.update( task_serializer="json", accept_content=["json"], result_serializer="json", )
使用配置模塊:
app.config_from_object("celeryconfig")
celeryconfig.py
broke_url = "pyamqp://" task_serializer = "json" task_serializer = "json" result_serializer = "json" accept_content = ["json"] timezone = "Europe/Oslo" enable_utc = True
如果想測試配置文件是否有語法問題,和普通的py文件一樣,使用:
python -m celeryconfig
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38511.html
摘要:我們將窗口切換到的啟動窗口,會看到多了兩條日志這說明任務已經被調度并執行成功。本文標題為異步任務神器簡明筆記本文鏈接為參考資料使用之美分布式任務隊列的介紹思誠之道異步任務神器簡明筆記 Celery 在程序的運行過程中,我們經常會碰到一些耗時耗資源的操作,為了避免它們阻塞主程序的運行,我們經常會采用多線程或異步任務。比如,在 Web 開發中,對新用戶的注冊,我們通常會給他發一封激活郵件,...
摘要:所以這就現實了在中使用的應用上下文。要引入請求上下文,需要考慮這兩個問題如何在中產生請求上下文。中有和可以產生請求上下文。具體的思路還是在中重載類,通過,在的上下文環境下執行。將他們傳入,生成偽造的請求上下文可以覆蓋大多數的使用情況。 其實我只是想把郵件發送這個動作移到Celery中執行。既然用到了Celery,那么每次發郵件都單獨開一個線程似乎有點多余,異步任務還是交給Celery吧...
摘要:今天介紹一下如何在項目中使用搭建一個有兩個節點的任務隊列一個主節點一個子節點主節點發布任務,子節點收到任務并執行。 今天介紹一下如何在django項目中使用celery搭建一個有兩個節點的任務隊列(一個主節點一個子節點;主節點發布任務,子節點收到任務并執行。搭建3個或者以上的節點就類似了),使用到了celery,rabbitmq。這里不會單獨介紹celery和rabbitmq中的知識了...
摘要:文檔中文文檔官方文檔定時服務與結合使用簡介是一個自帶電池的的任務隊列。追蹤任務在不同狀態間的遷移,并檢視返回值。 文檔 中文文檔 官方文檔 celery定時服務、celery與django結合使用 簡介 Celery 是一個自帶電池的的任務隊列。它易于使用,所以你可以無視其所解決問題的復雜程度而輕松入門。它遵照最佳實踐設計,所以你的產品可以擴展,或與其他語言集成,并且它自帶了在生產...
閱讀 2833·2023-04-25 18:58
閱讀 977·2021-11-25 09:43
閱讀 1210·2021-10-25 09:46
閱讀 3494·2021-09-09 11:40
閱讀 1679·2021-08-05 09:59
閱讀 869·2019-08-29 15:07
閱讀 956·2019-08-29 12:48
閱讀 695·2019-08-29 11:19