91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis中如何配置Celery

發布時間:2021-07-26 15:52:51 來源:億速云 閱讀:472 作者:Leah 欄目:數據庫

今天就跟大家聊聊有關Redis中如何配置Celery,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

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

pip install celery[redis]

項目結構

$ tree your_project  your_project  ├── __init__.py  ├── main.py  ├── celery.py  └── tasks.py  0 directories, 4 files

其中,main.py是觸發Task的業務代碼。當然,文件名可以隨意改。celery.py是Celery的app定義的位置,tasks.py是Task定義的位置,文件名不建議修改。

配置Celery

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

from celery import Celery  from .settings import REDIS_URL  APP = Celery(      main=__package__,      broker=REDIS_URL,      backend=REDIS_URL,      include=[f'{__package__}.tasks'],  )  APP.conf.update(task_track_started=True)

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

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

額外設置的task_track_started,是命令Worker反饋STARTED狀態。默認情況下,是無法知道任務什么時候開始執行的。

編寫任務并調用

在tasks.py文件中,添加異步任務的實現。

from .celery import APP  @APP.task  def do_sth():      pass

在需要發起任務的地方,用.apply_async可以觸發異步調用。即,實際只是向消息隊列發送消息,真正的執行操作在遠程。

from celery.result import AsyncResult  from .tasks imprt do_sth  result = do_sth.apply_async()  assert isinstance(result, AsyncResult)

運行Worker:

celery -A your_project worker

運行原理

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

Redis中如何配置Celery

其中,main代表業務代碼主進程。它可能是Django、Flask這類Web服務,也可能是一個其它類型的進程。worker就是指Celery的Worker。

main發送消息后,會得到一個AsyncResult,其中包含task_id。僅通過task_id,也可以自己構造一個AsyncResult,查詢相關信息。其中,代表運行過程的,主要是state。

worker會持續保持對Redis(或其它消息隊列,如RabbitMQ)的關注,查詢新的消息。如果獲得新消息,將其消費后,開始運行do_sth。運行完成會把返回值對應的結果,以及一些運行信息,回寫到Redis(或其它backend,如Django數據庫等)上。在系統的任何地方,通過對應的AsyncResult(task_id)就可以查詢到結果。

Celery Task的狀態

以下是狀態圖:

Redis中如何配置Celery

其中,除SUCCESS外,還有失敗(FAILURE)、取消(REVOKED)兩個結束狀態。而RETRY則是在設置了重試機制后,進入的臨時等待狀態。

另外,如果保存在Redis的結果信息被清理(默認僅保存1天),那么任務狀態又會變成PENDING。這在設計上是個巨大的問題,使用時要做對應容錯。

常見控制操作

result = AsyncResult(task_id)  # 阻塞等待返回  result.wait()  # 取消任務  result.revoke()  # 刪除任務記錄  result.forget()

有時,在業務主進程中需要等待異步運行的結果,這時需要使用wait。如果要取消一個排隊中、或已執行的任務,則可以使用revoke。即使任務已經執行完成,也可以使用revoke,但不會有任何變化。如果需要提前刪除任務記錄,可以使用forget。

看完上述內容,你們對Redis中如何配置Celery有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節
推薦閱讀:
  1. celery怎么用
  2. celery queue

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

梁河县| 安陆市| 彭山县| 宜兰市| 南陵县| 田阳县| 香河县| 镇原县| 浦城县| 渝北区| 阜新| 巴马| 景洪市| 仪征市| 神池县| 辽阳县| 宜丰县| 龙胜| 东城区| 吉木萨尔县| 邓州市| 武清区| 泸定县| 凤冈县| 玛纳斯县| 乌兰察布市| 阿拉善盟| 乐平市| 平定县| 吴江市| 宜君县| 宁夏| 农安县| 临安市| 来宾市| 沂源县| 桂林市| 留坝县| 吉水县| 乌恰县| 尚义县|