celery使用的一些小坑和技巧(非從無到有的過程)

来源:http://www.cnblogs.com/summery91/archive/2017/01/01/6240660.html
-Advertisement-
Play Games

純粹是記錄一下自己在剛開始使用的時候遇到的一些坑,以及自己是怎樣通過配合redis來解決問題的。文章分為三個部分,一是怎樣跑起來,並且怎樣監控相關的隊列和任務;二是遇到的幾個坑;三是給一些自己配合redis使用的代碼示例。 一.celery使用: Ⅰ.把任務中間件伺服器跑起來,rabbitmq-se ...


純粹是記錄一下自己在剛開始使用的時候遇到的一些坑,以及自己是怎樣通過配合redis來解決問題的。
文章分為三個部分,一是怎樣跑起來,並且怎樣監控相關的隊列和任務;二是遇到的幾個坑;三是給一些自己配合redis使用的代碼示例。

一.celery使用:
  Ⅰ.把任務中間件伺服器跑起來,rabbitmq-server
    跑起來以後,就能在瀏覽器(http://localhost:15672/#/queues)裡面看中間件裡面的相關內容了。
    (如果想把這邊的某些隊列下麵的沒有跑完的任務丟棄掉的話,進對應的隊列,點擊delete)
  Ⅱ.在終端裡面對應路徑下麵把celery的任務隊列跑起來:
    eg:celery -A celery_autowork_task worker --loglevel=info -Q auto_work
    註意裡面的各個參數的意義
  Ⅲ.看具體的每個任務的執行情況,是否成功之類的
    1.安裝flower,pip3 install flower
    2.用celery把flower跑起來celery flower
    3.http://localhost:5555在這個鏈接,或者終端裡面看見的就能看具體的每個任務的執行情況
二.坑: 
  Ⅰ.異常場景:併發數設置成4,然後第一次進去隊列的時候是用的第一個,retry的時候,居然在4和2裡面都觸發了任務。也就是關了一個,開了兩個。
  異常原因:在exception的代碼段裡面加了retry功能, 然後在try的代碼段裡面也加了try功能,但是查看retry函數本身的定義,發現它的類型就是exception;也就是調用這個本身就是一個異常會走到處理異常的代碼段裡面去;所以更好的方式是只在exception的代碼段裡面retry,然後如果try裡面需要retry的話,直接用raise 搞一個異常出來;
  Ⅱ.異常場景:在task裝飾器裡面定義重試間隔時間default_retry_delay,或者在retry裡面指定countdown為5秒,但是在終端裡面看見的一個任務的兩次開始執行時間發現都會大於5秒。開始還以為是不是兩個設置會互相影響。
  異常原因:後來發現的default_retry_dalay是在retry的時候沒有傳參數的的預設重試間隔時間,可以看模塊代碼http://docs.celeryproject.org/en/latest/_modules/celery/app/task.html?highlight=task;但之所以一個任務的兩次開始執行時間大於5秒是因為,我們的retry一般都寫在exception的代碼塊裡面,而這個間隔時間,其實指的是,執行到retry的時間往後推5秒。try裡面的操作會有耗時,所以導致了兩次任務的開始時間大於5秒。那麼如果想要兩次的開始時間為5秒的話,可以在進入任務的時候進行一下計時,然後任務重試的時候看整個try的代碼塊的耗時。
  Ⅲ.異常場景:在task裝飾器裡面提供了max_retries最大重試次數,然後到達最大重試次數(比如10次)以後,在第十次的重試裡面仍然會走到retry方法,這個時候,居然在終端開間異常拋出了。
  異常原因:按我的個人理解,這種設定了10次重試次數,但是在第十次開啟第11次的重試時候,應該模塊是自動不讓重試才對的。可是貌似沒有完成,或者可能是我沒有搜索到正確的使用方法;解決辦法就是自己在重試之前看當前的重試次數,自己控制
  Ⅳ.異常場景:如果一次任務在第一次的發起,重試次數還沒到的時候想要第二次發起怎麼辦?就是一般來說還是只允許一個實際任務只有一個隊列裡面的任務處理它
  處理辦法:不管是delay還是apply_async方法都是有返回值的,這個返回值的是celery裡面的一個類,可以string以後得到任務的ID,然後之後用app.control裡面的revoke方法把對應的任務中斷掉。可以查看對應模塊的源代碼http://docs.celeryproject.org/en/latest/_modules/celery/app/control.html
三.代碼示例
  celery_autowork_task.py【任務執行方法的定義的地方】

from celery import Celery
AutoWork = Celery('auto_work', broker = 【CELERY_BROKER】, backend = '')
AutoWork.conf.CELERY_TIMEZONE              = 'Asia/Shanghai'  # 時區
AutoWork.conf.CELERYD_CONCURRENCY          = 4                # 任務併發數
AutoWork.conf.CELERYD_TASK_SOFT_TIME_LIMIT = 300              # 任務超時時間
AutoWork.conf.CELERY_DISABLE_RATE_LIMITS   = True             # 任務頻率限制開關

AutoWork.conf.CELERY_ROUTES = {                               # 任務調度隊列
    "autowork_check_barcode_recharge":{"queue":"auto_work"},
}

@AutoWork.task(bind=True,name="autowork_check_barcode_recharge",max_retries=15)
def autowork_check_barcode_recharge(self,recharge_id):
    time_begin=datetime.datetime.now()
    try:
        pass
    except Exception as exc:
        retries=self.request.retries
        if retries<self.max_retries:
            delta_second=(datetime.datetime.now()-time_begin).seconds
            if delta_second<5:
                return self.retry(exc = exc,countdown=5-delta_second)
            else:
                return self.retry(exc = exc,countdown=0)
    finally:
        pass

 

  test.py【調用任務以及檢查任務的執行情況】

def cancel_pre_celery_task_and_excute_next_task(self,recharge_record):
        recharge_work_guid="recharge_work_guid:%d:%s"%(recharge_record.shop_id,recharge_record.num)
        from handlers.celery_autowork_task import autowork_check_barcode_recharge
        if redis.get(recharge_work_guid):  #上次是否有執行這個實際業務中的任務
            from celery_autowork_task import AutoWork
            AutoWork.control.revoke(redis.get(recharge_work_guid).decode('utf-8'),terminate=True) #如果有執行,則中斷
        autowork_guid=autowork_check_barcode_recharge.delay(recharge_record.id) #得到本次的任務GUID
        redis.set(recharge_work_guid,str(autowork_guid)) #保存到redis裡面去
        redis.expire(recharge_work_guid,3600)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ListView 預設的排列方向是縱向 ( Orientation="Vertical" ) ,但如果我們需要橫向顯示的 ListView 怎麼辦? Blend for Visual Studio 現在就派上用場了。不只是 ListView ,其他的控制項也可以用 Blend 定製你自己的 UI 樣式 ...
  • 網路電影免會員播放器 特色介紹網路電影免會員播放器是一款功能強大的VIP視頻免費播放器,讓用戶可以在多個媒體平臺上免費觀看VIP影片。支持愛奇藝、芒果、騰訊、等網站電影。無需解析,一鍵點擊即可線上播放。 使用方法 打開網站後,選擇一部電影,然後點播放,彈出播放器進行播放。 1.下載並運行軟體,選擇視 ...
  • 之前自己從來沒有做過發送郵箱的功能,前段時間項目需要,在找了很多帖子之後,終於實現了。 之後有整理了一下,寫了一個類。直接給類傳遞信息,就可以發送了。 這裡還需要說明的是,發送郵箱需要開通POP3/SMTP服務,否則QQ郵箱,網易郵箱等會報錯。接收的郵箱就不用開通啦,開通方法百度一下就知道啦。 ,直 ...
  • C 與C++相互發送消息 C 端: namespace CshapMessage { /// /// MainWindow.xaml 的交互邏輯 /// public partial class MainWindow : Window { IntPtr hwnd; const int WM_COPY ...
  • 問題描述: 一般調試wcf程式可以直接建一個單元測試,直接調介面。 但是,這次,我還要測試在介面內的代碼中看接收到的用戶名密碼是否正確,所以,單一的直接調用介面方法行不通, 然後就想辦法通過soapUI輸入用戶名和密碼調用介面調試。 解決方案: 1.建立IIS站點a,指向……src\WCF(右鍵項目 ...
  • 許多人都有各自的興趣,如打球、踢毽子、看書、看電視、玩游戲等等....我近來迷上了猜燈謎,於是業餘做了一個線上猜燈謎的網站:何問起謎語。先出個謎語讓你猜猜:不可缺一點(打一字)。可以線上猜:http://m.hovertree.com/miyu/bjae/j13e2e2e.htm,輸入答案,點擊“猜 ...
  • 劉海峰:國內知名微軟開源技術網站51Aspx 創始人,十年以上的Asp.net從業經驗,微軟MSDN特約講師、Teched講師、ImagineCup大賽評委、人大出版社研修班特約講師,曾多次受邀訪問美國西雅圖的微軟總部,2009年與業內知名MVP組建易縱互聯(北京)科技有限公司並任運營總監。現專註於 ...
  • 1. 適用場景 實現條件的過濾和查詢等功能。 2. 說明 跟SQL語句中的where作用相似,都起到了範圍的限定即過濾的作用,而判斷條件是緊跟後面的條件子句。where主要分為三種形式:簡單形式、條件形式、First()形式,下麵分別舉例測試一下: 2.1 簡單形式 例如:查詢在倫敦購買的訂單。 例 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...