0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

干貨:基于Redis配置Celery任務(wù)(附源碼)

如意 ? 來源:馬哥Linux運(yùn)維 ? 作者:零壹軒 ? 2020-09-03 10:53 ? 次閱讀

作為一個(gè)分布式異步計(jì)算框架,Celery雖然常用于Web框架中,但也可以單獨(dú)使用。 雖然常規(guī)搭配的消息隊(duì)列是RabbitMQ,但是由于某些情況下系統(tǒng)已經(jīng)包含了Redis,那就可以復(fù)用。

以下撇開Web框架,介紹基于Redis配置Celery任務(wù)的方法。

pip install celery[redis]

項(xiàng)目結(jié)構(gòu)

干貨:基于Redis配置Celery任務(wù)(附源碼)

其中,main.py是觸發(fā)Task的業(yè)務(wù)代碼。當(dāng)然,文件名可以隨意改。celery.py是Celery的app定義的位置,tasks.py是Task定義的位置,文件名不建議修改。

配置Celery

在celery.py中寫入如下代碼:

干貨:基于Redis配置Celery任務(wù)(附源碼)

其中,REDIS_URL從同一的配置settings.py中引入, 形式大概是redis://localhost:6379/0。這里既用Redis來當(dāng)broker,又用來當(dāng)backend。即,既當(dāng)消息隊(duì)列,又當(dāng)結(jié)果反饋的數(shù)據(jù)庫(默認(rèn)僅保存1天)。

在include=,需要填一個(gè)下游worker的包名列表。這里選擇了同一個(gè)包的tasks.py文件。

額外設(shè)置的task_track_started,是命令Worker反饋STARTED狀態(tài)。默認(rèn)情況下,是無法知道任務(wù)什么時(shí)候開始執(zhí)行的。

編寫任務(wù)并調(diào)用

在tasks.py文件中,添加異步任務(wù)的實(shí)現(xiàn)。

干貨:基于Redis配置Celery任務(wù)(附源碼)

在需要發(fā)起任務(wù)的地方,用.apply_async可以觸發(fā)異步調(diào)用。即,實(shí)際只是向消息隊(duì)列發(fā)送消息,真正的執(zhí)行操作在遠(yuǎn)程。

干貨:基于Redis配置Celery任務(wù)(附源碼)

運(yùn)行Worker:

celery -A your_project worker

運(yùn)行原理

一次Task從觸發(fā)到完成,序列圖如下:

干貨:基于Redis配置Celery任務(wù)(附源碼)

其中,main代表業(yè)務(wù)代碼主進(jìn)程。它可能是Django、Flask這類Web服務(wù),也可能是一個(gè)其它類型的進(jìn)程。worker就是指Celery的Worker。

main發(fā)送消息后,會得到一個(gè)AsyncResult,其中包含task_id。僅通過task_id,也可以自己構(gòu)造一個(gè)AsyncResult,查詢相關(guān)信息。其中,代表運(yùn)行過程的,主要是state。

worker會持續(xù)保持對Redis(或其它消息隊(duì)列,如RabbitMQ)的關(guān)注,查詢新的消息。如果獲得新消息,將其消費(fèi)后,開始運(yùn)行do_sth。運(yùn)行完成會把返回值對應(yīng)的結(jié)果,以及一些運(yùn)行信息,回寫到Redis(或其它backend,如Django數(shù)據(jù)庫等)上。在系統(tǒng)的任何地方,通過對應(yīng)的AsyncResult(task_id)就可以查詢到結(jié)果。

Celery Task的狀態(tài)

以下是狀態(tài)圖:

干貨:基于Redis配置Celery任務(wù)(附源碼)

其中,除SUCCESS外,還有失?。‵AILURE)、取消(REVOKED)兩個(gè)結(jié)束狀態(tài)。而RETRY則是在設(shè)置了重試機(jī)制后,進(jìn)入的臨時(shí)等待狀態(tài)。

另外,如果保存在Redis的結(jié)果信息被清理(默認(rèn)僅保存1天),那么任務(wù)狀態(tài)又會變成PENDING。這在設(shè)計(jì)上是個(gè)巨大的問題,使用時(shí)要做對應(yīng)容錯(cuò)。

常見控制操作

干貨:基于Redis配置Celery任務(wù)(附源碼)

有時(shí),在業(yè)務(wù)主進(jìn)程中需要等待異步運(yùn)行的結(jié)果,這時(shí)需要使用wait。如果要取消一個(gè)排隊(duì)中、或已執(zhí)行的任務(wù),則可以使用revoke。即使任務(wù)已經(jīng)執(zhí)行完成,也可以使用revoke,但不會有任何變化。如果需要提前刪除任務(wù)記錄,可以使用forget。
責(zé)編AJX

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1263

    瀏覽量

    69515
  • 分布式
    +關(guān)注

    關(guān)注

    1

    文章

    903

    瀏覽量

    74542
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    376

    瀏覽量

    10882
收藏 人收藏

    評論

    相關(guān)推薦

    redis集群環(huán)境安裝及配置

    redis集群主從配置
    發(fā)表于 03-08 09:59

    基于linux的安裝和配置redis

    linux(centos)下安裝、配置redis
    發(fā)表于 04-11 15:28

    阿里云ECS的redis配置步驟

    阿里云ECS配置redis
    發(fā)表于 10-28 08:28

    Mac上redis怎么安裝配置

    Mac上redis基本安裝配置及問題
    發(fā)表于 05-01 06:18

    啟動Redis的三種方法

    Redis筆記(1)——安裝、卸載、三種方法啟動Redis,Redis命令使用(干貨十足),Redis兩種方法設(shè)置密碼,時(shí)間復(fù)雜度(更完善哦
    發(fā)表于 06-08 16:09

    走近源碼Redis如何執(zhí)行命令的

    走近源碼Redis如何執(zhí)行命令
    發(fā)表于 06-09 16:31

    【昉·星光 2 高性能RISC-V單板計(jì)算機(jī)體驗(yàn)】Redis源碼編譯和性能測試以及與樹莓派4B對比

    本文首先介紹Redis是什么,然后介紹如何在VisionFive2上編譯Redis源碼,以及從源碼安裝Redis,最后介紹如何在Vision
    發(fā)表于 12-10 21:27

    【愛芯派 Pro 開發(fā)板試用體驗(yàn)】Redis源碼編譯和基準(zhǔn)測試

    本文首先介紹Redis是什么,然后介紹如何在愛芯派上編譯Redis源碼,以及從源碼安裝Redis,最后介紹如何在愛芯派上運(yùn)行
    發(fā)表于 12-10 22:18

    蜂鳴器播放音樂設(shè)計(jì)與實(shí)現(xiàn)(源碼

    蜂鳴器播放音樂設(shè)計(jì)與實(shí)現(xiàn)(源碼
    發(fā)表于 04-24 11:00 ?90次下載
    蜂鳴器播放音樂設(shè)計(jì)與實(shí)現(xiàn)(<b class='flag-5'>附</b><b class='flag-5'>源碼</b>)

    Schedule:簡單實(shí)用的 Python 周期任務(wù)調(diào)度工具

    。 ** ** 2.當(dāng)需要執(zhí)行的定時(shí)任務(wù)有上百個(gè)的時(shí)候,Crontab的 管理就會特別不方便 。 ** 另外一個(gè)選擇是 Celery,但是 Celery配置比較麻煩,如果你只是需
    的頭像 發(fā)表于 10-30 11:18 ?686次閱讀

    Celery Beat 的周期調(diào)度機(jī)制及實(shí)現(xiàn)原理

    Celery 是一個(gè)簡單、靈活且可靠的,處理大量消息的分布式系統(tǒng),它是一個(gè)專注于實(shí)時(shí)處理的任務(wù)隊(duì)列,同時(shí)也支持任務(wù)調(diào)度。 為了講解 Celery Beat 的周期調(diào)度機(jī)制及實(shí)現(xiàn)原理,我
    的頭像 發(fā)表于 10-31 15:24 ?713次閱讀

    Crontab:簡單實(shí)用的Python 周期任務(wù)調(diào)度工具

    ,Crontab 的 管理就會特別不方便 。 還有一個(gè)選擇是 Celery,但是 Celery配置比較麻煩,如果你只是需要一個(gè)輕量級的調(diào)度工具,Celery 不會是一個(gè)好選擇。 在
    的頭像 發(fā)表于 11-01 09:40 ?757次閱讀

    基于Django的Celery異步任務(wù)和定時(shí)任務(wù)的實(shí)戰(zhàn)教程

    Django與Celery是基于Python進(jìn)行Web后端開發(fā)的核心搭配,在運(yùn)營開發(fā)(即面向企業(yè)內(nèi)部)的場景中非常常見。 下面是基于Django的Celery異步任務(wù)和定時(shí)任務(wù)的實(shí)戰(zhàn)教
    的頭像 發(fā)表于 11-02 10:45 ?731次閱讀
    基于Django的<b class='flag-5'>Celery</b>異步<b class='flag-5'>任務(wù)</b>和定時(shí)<b class='flag-5'>任務(wù)</b>的實(shí)戰(zhàn)教程

    redis連接數(shù)配置多少合適

    Redis 是一款高性能的內(nèi)存數(shù)據(jù)庫,廣泛應(yīng)用于緩存、消息隊(duì)列、會話存儲等場景。在配置 Redis 連接數(shù)時(shí),需要根據(jù)實(shí)際情況綜合考慮一系列因素,如服務(wù)器硬件規(guī)格、業(yè)務(wù)負(fù)載、并發(fā)訪問量、數(shù)據(jù)模型等
    的頭像 發(fā)表于 12-04 11:31 ?1419次閱讀

    云容器redis持久化配置

    丟失。 Redis提供了不同的持久化機(jī)制,可以根據(jù)需要進(jìn)行配置。本文將詳細(xì)介紹云容器中Redis的持久化配置及其相關(guān)配置項(xiàng)。 一、
    的頭像 發(fā)表于 12-05 10:07 ?519次閱讀