redis实例python_生产消费者模式与python+redis实例运用(基础篇)
根據這個圖,我們舉個簡單的例子:假如你去某個餐廳吃飯,點了很多菜,廚師要一個一個菜的做,一個廚師不可能同時做出所有你點的菜,于是你有兩個選擇:第一個,廚師把所有菜都上齊了,你才開始吃;還有一個選擇,做好一個菜,端上桌一個你開始吃一個。這里的廚師就是生產者,而你就是消費者,菜就是圖中的product(產物)。我們可以很明顯的感覺到,第一種選擇會浪費很多時間,因為生產者要把所有產物生產完畢,消費者才開始從存儲中介當中去取,而且可能會浪費大量的內存空間,上萬條數據讀到內存中或許你沒有覺得,但是一旦數據量大了,就會很耗內存(這里指代存儲中介可能是吧數據讀到內存中);于是乎,生產消費者的優勢就出現了。
在開始之前我們要明白,既然是生產消費者模式,那么我們的代碼中就一定需要一個生產者,也需要一個消費者,在設計的時候我們要考慮到:1、生產者的速度跟不上消費者消費的速度,2、消費者速度跟不上生產者速度且存儲中介因為某些原因只能容納多少數據量。
針對以上第兩點問題,這個時候對于資源就需要經過鎖或者睡眠或者其他的操作來合理的分配,我們可以讓消費者每次取的時候看看存儲中介中是否有值,沒有值的話就等待一會再取,生產者每次往存儲中介中放數據的時候看一下是否快滿了,如果快滿了也一樣睡眠一會再看是否可以放。針對消費者消費過慢的情況,我們可以在代碼中開多進程和協程來解決這個問題,就好比這桌菜又多上得有快,我們就可以請幾個朋友一起來吃,共同消費。對于生產消費者模式如果加鎖,注意對于資源不要死鎖就行,這部分會在《生產消費者模式與python+redis實例運用(中級篇)》里面寫到
好了,基本原理和問題解決方針都有了,我們可以開始最基礎的操作來實現一波:
首先是生產者的代碼:
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("長度過大睡一會")
time.sleep(1)
product(i)
else:
#生產者r.lpush("goods2","good1"+str(i))
print("加入一個值睡一會")
# time.sleep(5)if__name__ == '__main__':
# 此處表示循環10000次,往redis里面放10000次數據fori inrange(10000):
product(i)
我們可以看到,每次當redis中的數據量大于5000的時候我們都讓程序sleep一會,然后再去判斷是否可以放,不能再睡1s。
接下來是消費者的代碼:
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隊列中沒有數據的時候,我們讓消費者等10s,再次去請求。
好了,基礎篇介紹到這里,接下來我們會介紹如何解決生產者過快,消費者過慢的問題解決方式以及生產消費者在python中實例運用,歡迎收看!
總結
以上是生活随笔為你收集整理的redis实例python_生产消费者模式与python+redis实例运用(基础篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双基因突变患者_双任务干预对携带LRRK
- 下一篇: python如何创建一个列表_在pyth