python利用redis做延時隊列

場景:平時工作中需要用到一些延時操作,同時避免多個人同時操作一個數(shù)據(jù)
1厨相、創(chuàng)建一個redis連接池

import redis
import uuid
import time
import threading
pool = redis.ConnectionPool(host="127.0.0.1", port=6379, decode_responses=True, db=3)
r = redis.Redis(connection_pool=pool)

2领曼、我們這邊用到的是redis里面的Zset(有序數(shù)組)鸥鹉,把任務(wù)根據(jù)延遲的時間進(jìn)行排隊{job:delayTime},然后依次進(jìn)行執(zhí)行

#創(chuàng)建一個延時器
def delayTask(name, delayTime):
    task_id = str(uuid.uuid4())
    processTime = delayTime + time.time()
    #往Zset里面的delay-queue鍵里面加入值
    r.zadd("delay-queue", {name + task_id: processTime}

#創(chuàng)建一個任務(wù)函數(shù)
def handleTask(task_id, ):
    """ do somethings"""
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())),"{0}延遲執(zhí)行完畢".format(task_id, ))

#創(chuàng)建一個loop函數(shù)
def loop():
    while True:
        #將數(shù)組里面的元素根據(jù)delayTime排隊之后庶骄,在0到當(dāng)前時間范圍內(nèi)循環(huán)取值毁渗,其實每次都只能取到一個,一定是這個時間和當(dāng)前時間一樣了才會被取到
        task_list = r.zrangebyscore("delay-queue", 0, time.time(), 0, 1)
        #如果為空单刁,證明沒有任務(wù)需要執(zhí)行灸异,進(jìn)入下一個循環(huán)
        if not task_list:
            print("cost 1s")
            time.sleep(1)
            continue
        else:
            #如果有值,就取值
            task_id = task_list[0]
            # 能刪除成功羔飞,證明被該線程搶到了這個任務(wù)肺樟,其他線程無法刪除,也就無法拿到任務(wù)
            is_del = r.zrem("delay-queue", task_id)
            if is_del:
                handleTask(task_id)


3逻淌、執(zhí)行函數(shù)

if __name__ == '__main__':
#方便演示么伯,我們開2個線程,其實只會有一個線程搶到該任務(wù)
    t1 = threading.Thread(target=loop)
    t2 = threading.Thread(target=loop)
    t1.start()
    t2.start()
    delayTask("任務(wù)一", 3)
    delayTask("任務(wù)二", 1)
    delayTask("任務(wù)三", 5)
2024-04-23 11:36:40
2024-04-23 11:36:40
2024-04-23 11:36:41 任務(wù)二7d455dc0-ff89-47de-a170-cbcbaea87c94延遲執(zhí)行完畢
2024-04-23 11:36:41
2024-04-23 11:36:41
2024-04-23 11:36:42
2024-04-23 11:36:42
2024-04-23 11:36:43 任務(wù)一a98fc5fd-2bff-4d6f-8ca9-5c42ab2d42cc延遲執(zhí)行完畢
2024-04-23 11:36:43
2024-04-23 11:36:43
2024-04-23 11:36:44
2024-04-23 11:36:44
2024-04-23 11:36:45 任務(wù)三aa7dc283-f5bc-4f71-b2ab-1e200bb32588延遲執(zhí)行完畢
2024-04-23 11:36:45
2024-04-23 11:36:45
可以看出主程序是40s開始執(zhí)行卡儒,我們在41s田柔,43s,45s分別執(zhí)行了job
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朋贬,一起剝皮案震驚了整個濱河市凯楔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锦募,老刑警劉巖摆屯,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異糠亩,居然都是意外死亡虐骑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門赎线,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廷没,“玉大人,你說我怎么就攤上這事垂寥〉呃瑁” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵滞项,是天一觀的道長狭归。 經(jīng)常有香客問我,道長文判,這世上最難降的妖魔是什么过椎? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮戏仓,結(jié)果婚禮上疚宇,老公的妹妹穿的比我還像新娘亡鼠。我一直安慰自己,他們只是感情好敷待,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布间涵。 她就那樣靜靜地躺著,像睡著了一般榜揖。 火紅的嫁衣襯著肌膚如雪浑厚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天根盒,我揣著相機(jī)與錄音钳幅,去河邊找鬼。 笑死炎滞,一個胖子當(dāng)著我的面吹牛敢艰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播册赛,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼钠导,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了森瘪?” 一聲冷哼從身側(cè)響起牡属,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扼睬,沒想到半個月后逮栅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡窗宇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年措伐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片军俊。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡侥加,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粪躬,到底是詐尸還是另有隱情担败,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布镰官,位于F島的核電站提前,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏朋魔。R本人自食惡果不足惜岖研,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一卿操、第九天 我趴在偏房一處隱蔽的房頂上張望警检。 院中可真熱鬧孙援,春花似錦、人聲如沸扇雕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镶奉。三九已至础淤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哨苛,已是汗流浹背鸽凶。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留建峭,地道東北人玻侥。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像亿蒸,于是被迫代替她去往敵國和親凑兰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容