成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于Redis配置Celery

數據庫 其他數據庫 Redis
作為一個分布式異步計算框架,Celery雖然常用于Web框架中,但也可以單獨使用。雖然常規搭配的消息隊列是RabbitMQ,但是由于某些情況下系統已經包含了Redis,那就可以復用。

作為一個分布式異步計算框架,Celery雖然常用于Web框架中,但也可以單獨使用。 雖然常規搭配的消息隊列是RabbitMQ,但是由于某些情況下系統已經包含了Redis,那就可以復用。

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

  1. pip install celery[redis] 

項目結構 

  1. $ tree your_project  
  2. your_project  
  3. ├── __init__.py  
  4. ├── main.py  
  5. ├── celery.py  
  6. └── tasks.py  
  7. 0 directories, 4 files 

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

配置Celery

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

  1. from celery import Celery  
  2. from .settings import REDIS_URL  
  3. APP = Celery 
  4.     main=__package__ 
  5.     broker=REDIS_URL 
  6.     backend=REDIS_URL 
  7.     include=[f'{__package__}.tasks'],  
  8.  
  9. 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文件中,添加異步任務的實現。 

  1. from .celery import APP  
  2. @APP.task  
  3. def do_sth():  
  4.     pass 

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

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

運行Worker: 

  1. celery -A your_project worker 

運行原理

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

其中,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的狀態

以下是狀態圖:

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

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

常見控制操作 

  1. result = AsyncResult(task_id)  
  2. # 阻塞等待返回  
  3. result.wait()  
  4. # 取消任務  
  5. result.revoke()  
  6. # 刪除任務記錄  
  7. result.forget() 

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

 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2024-07-30 08:38:13

2015-07-23 16:38:56

Redis

2022-09-16 11:23:59

Python框架Celery

2011-11-25 11:23:29

IPsec VPNIPsec VPN配置

2017-07-11 13:30:12

RedisDockerLinux

2023-12-30 13:47:48

Redis消息隊列機制

2016-12-19 14:59:00

redis.conf配置事例數據

2021-10-30 19:30:23

分布式Celery隊列

2011-03-08 11:08:55

VLAN

2016-10-28 08:39:23

WebHook運維工具

2009-06-14 16:59:16

ibmdwWebSphere

2023-03-06 10:42:45

2023-07-03 07:55:25

2012-10-30 10:09:56

Redis

2017-03-20 15:08:04

RedisNoSQLcentos6

2019-03-18 14:58:18

RedisMySQLMongoDB

2020-06-03 16:44:28

RedisJava技術

2022-01-27 20:15:31

集群存儲元數據

2020-02-07 09:44:30

Redis哨兵數據庫

2022-03-08 15:24:23

BitMapRedis數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品国产馆在线真实露脸 | 欧美精品一区二区免费视频 | 成人精品视频在线观看 | 亚洲免费网址 | 中文字幕国产高清 | 欧美人人| 欧美日韩1区| 欧美一区二区三区在线视频 | 亚洲综合色视频在线观看 | 九七午夜剧场福利写真 | 中文字幕亚洲精品 | 黄色一级视频免费 | 在线看片网站 | 精品欧美一区二区久久久伦 | 天天搞天天搞 | 国产91 在线播放 | 玖玖爱365| 91综合在线观看 | 亚洲精品久久久久中文字幕欢迎你 | 国产亚洲精品美女久久久久久久久久 | 久久精品毛片 | 青青久久久| 一区二区高清 | 亚洲精品在线看 | 日韩精品在线网站 | 乱码av午夜噜噜噜噜动漫 | 美女视频一区 | 日韩av成人在线 | 色啪网 | 日日干干 | 无码一区二区三区视频 | 久久97精品 | 国产成人免费视频网站高清观看视频 | av影音 | 成人午夜视频在线观看 | 九九在线精品视频 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 艹逼网 | 人人九九精 | 亚洲色在线视频 | 不卡视频在线 |