redis实例python_生产消费者模式与python+redis实例运用(基础篇)
根據(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双基因突变患者_双任务干预对携带LRRK
- 下一篇: python如何创建一个列表_在pyth