Celery的實踐指南

Celery的實踐指南
celery原理:
celery實際上是實現了一個典型的生產者-消費者模型的消息處理/任務調度統,消費者(worker)和生產者(client)都可以有任意個,他們通過消息系統(broker)來通信。
典型的場景為:
  1. 客戶端啟動一個進程(生產者),當用戶的某些操作耗時較長或者比較頻繁時,考慮接入本消息系統,發送一個task任務給broker。
  2. 后臺啟動一個worker進程(消費者),當發現broker中保存有某個任務到了該執行的時間,他就會拿過來,根據task類型和參數執行。
實踐中的典型場景:
  1. 簡單的定時任務:
    1. 替換crontab的celery寫法:

      1. from?celery?import?Celery
        from?celery.schedules?import?crontab

        app?=?Celery("tasks",?backend="redis://localhost",?broker="redis://localhost")

        app.conf.update(CELERYBEAT_SCHEDULE?=?{
        ? ? "add":?{
        ? ? ? ? "task":?"celery_demo.add",
        ? ? ? ? "schedule":?crontab(minute="*"),
        ? ? ? ? "args":?(16,?16)
        ? ? },
        })

        @app.task
        def?add(x,?y):
        ? ? return?x?+?y

    2. 運行celery的worker,讓他作為consumer運行,自動從broker上獲得任務并執行。
      1. `celery?-A?celery_demo?worker`
    3. 運行celery的client,讓其根據schedule,自動生產出task msg,并發布到broker上。
      1. `celery?-A?celery_demo?beat`
    4. 安裝并運行flower,方便監控task的運行狀態
      1. `celery?flower?-A?celery_demo`
      2. 或者設置登錄密碼 `
        celery?flower?-A celery_demo --basic_auth=user1:password1,user2:password2
  2. 多同步任務-鏈式任務-
  3. 失敗自動重試的task
    1. 失敗重試方法: 將task代碼函數參數增加self,同時綁定bind。
    2. demo代碼:
      1. @app.task(bind=True,?default_retry_delay=300,?max_retries=5)
        def?my_task_A(self):
        ? ? try:
        ? ? ? ? print("doing?stuff?here...")
        ? ? except?SomeNetworkException?as?e:
        ? ? ? ? print("maybe?do?some?clenup?here....")
        ? ? ? ? self.retry(e)
    3. 自動重試后,是否將任務重新入queue后排隊,還是等待指定的時間?可以通過self.retry()參數來指定。
  4. 派發到不同Queue隊列的task
    1. 一個task自動映射到多個queue中的方法, 通過配置task和queue的routing_key命名模式。
      1. 比如:把queue的exchange和routing_key配置成通用模式:
      2. 再定義task的routing_key的名稱:
    2. 可用的不同exchange策略:
      1. direct:直接根據定義routing_key
      2. topic:exchange會根據通配符來將一個消息推送到多個queue。
      3. fanout:將消息拆分,分別推送到不同queue,通常用于超大任務,耗時任務。
    3. 參考:http://celery.readthedocs.org/en/latest/userguide/routing.html#routers
  5. 高級配置
    1. result是否保存
    2. 失敗郵件通知:
    3. 關閉rate limit:
  6. auto_reload方法(*nix系統):
    1. celery通過監控源代碼目錄的改動,自動地進行reload
    2. 使用方法:1.依賴inotify(Linux) 2. kqueue(OS X / BSD)
    3. 安裝依賴:
      $?pip?install?pyinotify
    4. (可選) 指定fsNotify的依賴:
      $?env?CELERYD_FSNOTIFY=stat?celery?worker?-l?info?--autoreload
    5. 啟動: celery -A appname worker --autoreload
  7. auto-scale方法:
    1. 啟用auto-scale
    2. 臨時增加worker進程數量(增加consumer):
      $?celery?-A?proj?control?add_consumer?foo?-d?worker1.local
    3. 臨時減少worker進程數量(減少consumer):
  8. 將scheduled task的配置從app.conf變成DB的方法:
    1. 需要在啟動時指定custom schedule 類名,比如默認的是: celery.beat.PersistentScheduler 。
      1. celery?-A?proj?beat?-S?djcelery.schedulers.DatabaseScheduler
  9. 啟動停止worker的方法:
    1. 啟動 as daemon :?http://docs.celeryproject.org/en/latest/tutorials/daemonizing.html#daemonizing
      1. root用戶可以使用celeryd
      2. 非特權用戶:celery multi start worker1 -A appName ?—autoreload ?--pidfile="$HOME/run/celery/%n.pid"? --logfile="$HOME/log/celery/%n.log"
      3. 或者 celery worker —detach
    2. 停止
    3. ps?auxww?|?grep?'celery?worker'?|?awk?'{print?$2}'?|?xargs?kill?-9
  10. 與Flask集成的方法
    1. 集成后flask將充當producer來創建并發送task給broker,在celery啟動的獨立worker進程將從broker中獲得task并執行,同時將結果返回。
    2. flask中異步地獲得task結果的方法:add.delay(x,y),有時需要對參數進行命名后傳遞 或者 add.apply_async(args=(x,y), countdown=30)
    3. flask獲得
  11. 與flask集成后的啟動問題
    1. 由于celery的默認routing_key是根據生產者在代碼中的import級別來設定的,所以worker端在啟動時應該注意其啟動目錄應該在項目頂級目錄上,否者會出現KeyError。
  12. 性能提升: eventlet 和 greenlet
官方參考:http://docs.celeryproject.org/en/latest/userguide/index.html

轉載于:https://www.cnblogs.com/ToDoToTry/p/5453149.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255410.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255410.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【pyqt5學習】——bug修復,利用qt資源庫qrc文件進行背景圖像設置,不顯示圖像

目錄 bug描述 bug分析 bug解決 bug描述 利用下面文章的方法進行資源設置后,有的顯示了有的沒有顯示 【pyqt5學習】——pyqt5中.qrc資源文件的創建與編寫_有情懷的機械男的博客-CSDN博客_python qrc目錄一、說明二、安裝pyqt5以及相關工具(pyqt5、pyuic…

Datalore:用于機器學習可視化的新Web方案!

前不久,JetBrains團隊發布了Datalore,這是一款基于云的web應用程序,用于構建機器學習模型并在Python中創建豐富的可視化。最新的測試版本旨在簡化構建機器學習模型的流程,并幫助開發人員進行數據分析。由于Datalore的智能編碼輔助…

Val3語言介紹

Val3語言是一門專門針對特定工業機器人的一門語言。在墻內有關這方面的介紹非常的少。在墻外維基百科上有一篇詳細介紹的,有空FQ摘抄在這里。 Val3是使用XML格式。可以使用XML編輯器來進行編寫VAL3的程序,可直接在模擬器上或者示教盒上編程,一般推薦使用…

網絡層相關問題

1.說一下網絡層的總體結構。 2.有沒有看過源碼? A.繼承Request   B.打日志   C.修改參數 3.說一下Volley整體結構。 4.有了解過OkHttp嗎? 5.說一下OkHttp和Volley的區別?轉載于:https://www.cnblogs.com/jarvisyin/p/6389553.html

CSS魔法堂:重拾Border之——圖片作邊框

前言 當CSS3推出border-radius屬性時我們是那么欣喜若狂啊,一想到終于不用再添加額外元素來模擬圓角了,但發現border-radius還分水平半徑和垂直半徑,然后又發現border-top-left/right-radius的水平半徑之和大于元素寬度時,實際值會…

共享內存簡介和mmap 函數

一、共享內存簡介 共享內存區是最快的IPC形式,這些進程間數據傳遞不再涉及到內核,換句話說是進程不再通過執行進入內核的系統調用來傳遞彼此的數據。 即每個進程地址空間都有一個共享存儲器的映射區,當這塊區域都映射到相同的真正的物理地址空…

【pyqt5學習】——QToolTip,QLabel控件,伙伴關系

目錄 0、學習資源 1、給控件設置提示信息——QToolTip 2、QLabel控件(顯示圖像、設置超鏈接、信號綁定) 3、QLabel伙伴關系 1)代碼 2)效果 3)知識點addWidget 0、學習資源 PyQt5教程,來自網易云課堂…

Hello IT

從高中的計算機課開始學習如何按下開機鍵,如何上網,如何背誦五筆字根,再到大學中如何使用office,利用C編碼做算法,到現在IT中的偽一員,時間算起來也不短,然正在入門是在2010年8月杭州參加嵌入式培訓&#x…

ARM指令集2

ARM指令集2 ARM微處理器支持加載/存儲指令用于在寄存器和存儲器之間傳送數據,加載指令用于將存儲器中的數據傳送到寄存器,存儲指令則完成相反的操作。 LDR指令(與MOV有區別,MOV只能操作通用寄存器) LDR指令格式為&…

SylixOS中select原理及使用分析

2019獨角獸企業重金招聘Python工程師標準>>> 1. select接口簡介 1.1 select接口使用用例 select是操作系統多路I/O復用技術實現的方式之一。 多路I/O復用技術大致使用場景為:構造一張感興趣的文件描述符列表,然后調用多路復用的IO接口&#x…

【pyqt5學習】——QLineEdit學習(回顯模式)

目錄 1、回顯模式 2、成果顯示 3、知識點 1)FormLayout布局添加addRow方法 2)在輸入框顯示灰色提示字體,輸入內容時消失setPlaceholderText 3)設置回顯模式setEchoMode 4、完整代碼 1、回顯模式 QLineEdit控件的主要功能是輸…

有關機械手臂控制中的兩個重要輸入參數

1.在機械手臂中有兩個重要參數。一個是編碼器的值,另外一個是馬達的電流值。根據這兩個可以獲得機械手臂的運動學,動力學的一些數據。第一重要特征參數 是DH參數,另外一個就是每個軸的質心參數。

MySQL的權限分配

MySQL 賦予用戶權限命令的簡單格式可概括為:grant 權限 on 數據庫對象 to 用戶,如 GRANT PRIVILEGES ON datebase.* to user% IDENTIFIED by passwd;一、給表數據賦權 grant 普通數據用戶,查詢、插入、更新、刪除 數據庫中所有表數據的權利。…

用HttpURLConnection發送http請求

//發送http請求try {//1.使用網址構造一個URL對象 URL url new URL(path);//2.獲取連接對象 HttpURLConnection conn (HttpURLConnection) url.openConnection();//3.設置一些屬性 //設置請求方式,注意大寫conn.setRequestMethod("GET");//設置請求超時…

【pyqt5學習】——QLineEdit控件輸入校驗器Validator、掩碼setInputMask限制輸入、textChanged信號

目錄 1、輸入校驗器——限制輸入框輸入的內容 1)校驗器類型——整數、浮點數、數字字母結合(正則) 2)步驟 3)結果 ?編輯 ?編輯 4)完整代碼 2、利用掩碼進行輸入的限制 0)掩碼對照表 1…

Call requires API level 3 (current min is 1)

結果出現“Call requires API level 3 (current min is 1): 解決方法: 在工程上點擊右鍵 -> Android Tools -> Clear Lint Markers,即可。轉載于:https://www.cnblogs.com/qianyukun/p/5458331.html

Product文本格式說明

使用txt進行產品信息的說明。 Product文本格式說明 //**************************************************** //產品信息 //固定標識符全部大寫,全部在等號()前面 //****************************************************** PRODUCTTest //…

PyOpenCL圖像處理:Box模糊

為什么80%的碼農都做不了架構師?>>> # -*- coding: utf-8 -*-from __future__ import absolute_import, print_function import numpy as np import pyopencl as cl import cv2 from PIL import Imagedef RoundUp(groupSize, globalSize): r globalSi…

【python bug修復】——Script file ‘D:\softwares_install\Anaconda3\envs\PartTimes\Scripts\pip-scrip

目錄 1、問題描述 2、問題解決 1)下載pip安裝腳本 2) 運行安裝pip腳本 3) 下載庫 1、問題描述 利用pip命令進行庫的安裝時,突然出現這個問題,之前使用還好好的 Script file D:\softwares_install\Anaconda3\envs\P…

項目中的那些事---下載pdf文件

最近做了一個下載pdf文檔的需求&#xff0c;本以為使用HTML5中<a>標簽的屬性download就能簡單搞定&#xff0c;不料IE竟然不支持這一簡單粗暴的H5新特性&#xff0c;而是直接在網頁中打開&#xff0c; 于是各種搜索之后得出以下結論&#xff1a;IE中下載文檔時&#xff0…