pythoncelery
『壹』 Django配置Celery執行非同步和同步任務(tasks))
celery是一個基於python開發的簡單、靈活且可靠的分布式任務隊列框架,支持使用任務隊列的方式在分布式的機器/進程/線程上執行任務調度。採用典型的生產者-消費者模型,主要由三部分組成:
比如系統上線前後台批量導入歷史數據,發送簡訊、發送郵件等耗時的任務
1.安裝RabbitMQ,這里我們使用RabbitMQ作為broker,安裝完成後默認啟動了,也不需要其他任何配置
Ubuntu linux安裝
CentOS Linux 安裝
蘋果mac 安裝需要配置
配置環境變數 (蘋果用戶)
啟動rabbitmq-server
2.安裝celery
3.celery用在django項目中,django項目目錄結構(簡化)如下
4.創建 oa/celery.py 主文件
5.在 oa/__init__.py 文件中增加如下內容,確保django啟動的時候這個app能夠被載入到
6.各應用創建tasks.py文件,這里為 users/tasks.py
7.views.py中引用使用這個tasks非同步處理
8.啟動celery
9.這樣在調用post這個方法時,里邊的add就可以非同步處理了
定時任務的使用場景就很普遍了,比如我需要定時發送報告給老闆~
1. oa/celery.py 文件添加如下配置以支持定時任務crontab
3.啟動celery beat,celery啟動了一個beat進程一直在不斷的判斷是否有任務需要執行
『貳』 python 使用celery為了解決什麼業務問題
Celery是一個專注於實時處理和任務調度的分布式任務隊列。所謂任務就是消息,消息中的有效載荷中包含要執行任務需要的全部數據。
使用Celery的常見場景如下:
1. Web應用。當用戶觸發的一個操作需要較長時間才能執行完成時,可以把它作為任務交給Celery去非同步執行,執行完再返回給用戶。這段時間用戶不需要等待,提高了網站的整體吞吐量和響應時間。
2. 定時任務。生產環境經常會跑一些定時任務。假如你有上千台的伺服器、上千種任務,定時任務的管理很困難,Celery可以幫助我們快速在不同的機器設定不同種任務。
3. 同步完成的附加工作都可以非同步完成。比如發送簡訊/郵件、推送消息、清理/設置緩存等。
Celery還提供了如下的特性:
1. 方便地查看定時任務的執行情況,比如執行是否成功、當前狀態、執行任務花費的時間等。
2. 可以使用功能齊備的管理後台或者命令行添加、更新、刪除任務。
3. 方便把任務和配置管理相關聯。
4. 可選多進程、Eventlet和Gevent三種模式並發執行。
5. 提供錯誤處理機制。
- 提供多種任務原語,方便實現任務分組、拆分和調用鏈。
- 支持多種消息代理和存儲後端。
『叄』 Python 非同步任務隊列Celery 使用
在 Python 中定義 Celery 的時候,我們要引入 Broker,中文翻譯過來就是「中間人」的意思。在工頭(生產者)提出任務的時候,把所有的任務放到 Broker 裡面,在 Broker 的另外一頭,一群碼農(消費者)等著取出一個個任務准備著手做。這種模式註定了整個系統會是個開環系統,工頭對於碼農們把任務做的怎樣是不知情的。所以我們要引入 Backend 來保存每次任務的結果。這個 Backend 也是存儲任務的信息用的,只不過這里存的是那些任務的返回結果。我們可以選擇只讓錯誤執行的任務返回結果到 Backend,這樣我們取回結果,便可以知道有多少任務執行失敗了。
其實現架構如下圖所示:
可以看到,Celery 主要包含以下幾個模塊:
celery可以通過pip自動安裝。
broker 可選擇使用RabbitMQ/redis,backend可選擇使用RabbitMQ/redis/MongoDB。RabbitMQ/redis/mongoDB的安裝請參考對應的官方文檔。
------------------------------rabbitmq相關----------------------------------------------------------
官網安裝方法: http://www.rabbitmq.com/install-windows.html
啟動管理插件:sbin/rabbitmq-plugins enable rabbitmq_management 啟動rabbitmq:sbin/rabbitmq-server -detached
rabbitmq已經啟動,可以打開頁面來看看 地址: http://localhost:15672/#/
用戶名密碼都是guest 。進入可以看到具體頁面。 關於rabbitmq的配置,網上很多 自己去搜以下就ok了。
------------------------------rabbitmq相關--------------------------------------------------------
項目結構如下:
使用前,需要三個方面:celery配置,celery實例,需執行的任務函數,如下:
Celery 的配置比較多,可以在 官方配置文檔: http://docs.celeryproject.org/en/latest/userguide/configuration.html 查詢每個配置項的含義。
當然,要保證上述非同步任務and下述定時任務都能正常執行,就需要先啟動celery worker,啟動命令行如下:
需 啟動beat ,執行定時任務時, Celery會通過celery beat進程來完成。Celery beat會保持運行, 一旦到了某一定時任務需要執行時, Celery beat便將其加入到queue中. 不像worker進程, Celery beat只需要一個即可。而且為了避免有重復的任務被發送出去,所以Celery beat僅能有一個。
命令行啟動:
如果你想將celery worker/beat要放到後台運行,推薦可以扔給supervisor。
supervisor.conf如下:
『肆』 簡單強大的Python庫!Schele—實用的周期任務調度工具
如果你想在Linux伺服器上周期性地執行某個 Python 腳本,最出名的選擇應該是 Crontab 腳本,但是 Crontab 具有以下缺點:
1.不方便執行 秒級的任務 。
2.當需要執行的定時任務有上百個的時候,Crontab的 管理就會特別不方便 。
另外一個選擇是 Celery,但是 Celery 的配置比較麻煩,如果你只是需要一個輕量級的調度工具,Celery 不會是一個好選擇。
在你想要使用一個輕量級的任務調度工具,而且希望它盡量簡單、容易使用、不需要外部依賴,最好能夠容納 Crontab 的所有基本功能,那麼 Schele 模塊是你的不二之選。
使用它來調度任務可能只需要幾行代碼,感受一下:
上面的代碼表示每10分鍾執行一次 job 函數,非常簡單方便。你只需要引入 schele 模塊,通過調用 scele.every(時間數).時間類型.do(job) 發布周期任務。
發布後的周期任務需要用 run_pending 函數來檢測是否執行,因此需要一個 While 循環不斷地輪詢這個函數。
下面具體講講Schele模塊的安裝和初級、進階使用方法。
1.准備
請選擇以下任一種方式輸入命令安裝依賴 :
1. Windows 環境 打開 Cmd (開始-運行-CMD)。
2. MacOS 環境 打開 Terminal (command+空格輸入Terminal)。
3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
2.基本使用
最基本的使用在文首已經提到過,下面給大家展示更多的調度任務例子:
可以看到,從月到秒的配置,上面的例子都覆蓋到了。不過 如果你想只運行一次任務 的話,可以這么配:
參數傳遞
如果你有參數需要傳遞給作業去執行,你只需要這么做:
獲取目前所有的作業
如果你想獲取目前所有的作業:
取消所有作業
如果某些機制觸發了,你需要立即清除當前程序的所有作業:
標簽功能
在設置作業的時候,為了後續方便管理作業,你可以給作業打個標簽,這樣你可以通過標簽過濾獲取作業或取消作業。
設定作業截止時間
如果你需要讓某個作業到某個時間截止,你可以通過這個方法:
截止日期之後,該作業將無法運行。
立即運行所有作業,而不管其安排如何
如果某個機制觸發了,你需要立即運行所有作業,可以調用 schele.run_all :
3.高級使用
裝飾器安排作業
如果你覺得設定作業這種形式太啰嗦了,也可以使用裝飾器模式:
並行執行
默認情況下,Schele 按順序執行所有作業。其背後的原因是,很難找到讓每個人都高興的並行執行模型。
不過你可以通過多線程的形式來運行每個作業以解決此限制:
日誌記錄
Schele 模塊同時也支持 logging 日誌記錄,這么使用:
效果如下:
異常處理
Schele 不會自動捕捉異常,它遇到異常會直接拋出,這會導致一個嚴重的問題: 後續所有的作業都會被中斷執行 ,因此我們需要捕捉到這些異常。
你可以手動捕捉,但是某些你預料不到的情況需要程序進行自動捕獲,加一個裝飾器就能做到了:
這樣, bad_task 在執行時遇到的任何錯誤,都會被 catch_exceptions 捕獲,這點在保證調度任務正常運轉的時候非常關鍵。