日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

redis实例python_生产消费者模式与python+redis实例运用(基础篇)

發(fā)布時(shí)間:2024/7/19 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis实例python_生产消费者模式与python+redis实例运用(基础篇) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

根據(jù)這個(gè)圖,我們舉個(gè)簡(jiǎn)單的例子:假如你去某個(gè)餐廳吃飯,點(diǎn)了很多菜,廚師要一個(gè)一個(gè)菜的做,一個(gè)廚師不可能同時(shí)做出所有你點(diǎn)的菜,于是你有兩個(gè)選擇:第一個(gè),廚師把所有菜都上齊了,你才開始吃;還有一個(gè)選擇,做好一個(gè)菜,端上桌一個(gè)你開始吃一個(gè)。這里的廚師就是生產(chǎn)者,而你就是消費(fèi)者,菜就是圖中的product(產(chǎn)物)。我們可以很明顯的感覺到,第一種選擇會(huì)浪費(fèi)很多時(shí)間,因?yàn)樯a(chǎn)者要把所有產(chǎn)物生產(chǎn)完畢,消費(fèi)者才開始從存儲(chǔ)中介當(dāng)中去取,而且可能會(huì)浪費(fèi)大量的內(nèi)存空間,上萬條數(shù)據(jù)讀到內(nèi)存中或許你沒有覺得,但是一旦數(shù)據(jù)量大了,就會(huì)很耗內(nèi)存(這里指代存儲(chǔ)中介可能是吧數(shù)據(jù)讀到內(nèi)存中);于是乎,生產(chǎn)消費(fèi)者的優(yōu)勢(shì)就出現(xiàn)了。

在開始之前我們要明白,既然是生產(chǎn)消費(fèi)者模式,那么我們的代碼中就一定需要一個(gè)生產(chǎn)者,也需要一個(gè)消費(fèi)者,在設(shè)計(jì)的時(shí)候我們要考慮到:1、生產(chǎn)者的速度跟不上消費(fèi)者消費(fèi)的速度,2、消費(fèi)者速度跟不上生產(chǎn)者速度且存儲(chǔ)中介因?yàn)槟承┰蛑荒苋菁{多少數(shù)據(jù)量。

針對(duì)以上第兩點(diǎn)問題,這個(gè)時(shí)候?qū)τ谫Y源就需要經(jīng)過鎖或者睡眠或者其他的操作來合理的分配,我們可以讓消費(fèi)者每次取的時(shí)候看看存儲(chǔ)中介中是否有值,沒有值的話就等待一會(huì)再取,生產(chǎn)者每次往存儲(chǔ)中介中放數(shù)據(jù)的時(shí)候看一下是否快滿了,如果快滿了也一樣睡眠一會(huì)再看是否可以放。針對(duì)消費(fèi)者消費(fèi)過慢的情況,我們可以在代碼中開多進(jìn)程和協(xié)程來解決這個(gè)問題,就好比這桌菜又多上得有快,我們就可以請(qǐng)幾個(gè)朋友一起來吃,共同消費(fèi)。對(duì)于生產(chǎn)消費(fèi)者模式如果加鎖,注意對(duì)于資源不要死鎖就行,這部分會(huì)在《生產(chǎn)消費(fèi)者模式與python+redis實(shí)例運(yùn)用(中級(jí)篇)》里面寫到

好了,基本原理和問題解決方針都有了,我們可以開始最基礎(chǔ)的操作來實(shí)現(xiàn)一波:

首先是生產(chǎn)者的代碼:

importtime

importredis

pool=redis.ConnectionPool(host='localhost',port=6379,db=1,decode_responses=True)

r=redis.Redis(connection_pool=pool)

defproduct(i):

length=r.llen("goods2")

print(length)

iflength>5000:

print("長(zhǎng)度過大睡一會(huì)")

time.sleep(1)

product(i)

else:

#生產(chǎn)者r.lpush("goods2","good1"+str(i))

print("加入一個(gè)值睡一會(huì)")

# time.sleep(5)if__name__ == '__main__':

# 此處表示循環(huán)10000次,往redis里面放10000次數(shù)據(jù)fori inrange(10000):

product(i)

我們可以看到,每次當(dāng)redis中的數(shù)據(jù)量大于5000的時(shí)候我們都讓程序sleep一會(huì),然后再去判斷是否可以放,不能再睡1s。

接下來是消費(fèi)者的代碼:

fromDBUtil import*

fromclickhouse_driver importClient

importdatetime

importtime

importpandas aspd

frompandasql importsqldf

importredis

pool=redis.ConnectionPool(host='localhost',port=6379,db=1,decode_responses=True)

r=redis.Redis(connection_pool=pool)

defusers():

length = r.llen("goods2")

print(length)

whilelength>0:

goods = r.lpop("goods2")

print(goods)

ifstr(goods)=="None":

print("無值多等等")

time.sleep(10)

else:

print("無值等等")

time.sleep(10)

users()

if__name__ == '__main__':

users()

我們也可以看到,在redis隊(duì)列中沒有數(shù)據(jù)的時(shí)候,我們讓消費(fèi)者等10s,再次去請(qǐng)求。

好了,基礎(chǔ)篇介紹到這里,接下來我們會(huì)介紹如何解決生產(chǎn)者過快,消費(fèi)者過慢的問題解決方式以及生產(chǎn)消費(fèi)者在python中實(shí)例運(yùn)用,歡迎收看!

總結(jié)

以上是生活随笔為你收集整理的redis实例python_生产消费者模式与python+redis实例运用(基础篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。