一:佇列(Queue):
1、定義:佇列可以理解成一個容器,這個容器內部是有順序的,類似于鏈表和堆疊,佇列也是存盤資料的結構,佇列中資料進入佇列的順序很重要,一般來說,佇列就是一群人或者事物按照排好的順序等待接受服務或者處理
2、作用:
a、程式之間的解耦(降低代碼依賴度):假如是在前端后端之間加入佇列,那么前端只需要將資料丟到佇列中,并不需要關心后端怎么生成資料的,前端用戶數量的擴展也與后端無關,后端資料處理能力的擴展也與前端無關,
b、提高程式執行效率:前端無需等待后端執行完畢,只需要將資料放到佇列中,佇列自行執行,這期間就可以去干別的事情,回頭來取結果即可,
3、佇列和串列的區別?
有串列為什么還要佇列呢?串列也可以當成一個容器來用,區別就在于串列資料取出相當于復制一份取出,除非手動洗掉這個資料,不然還依然會在串列中,而佇列則取走一個就自動洗掉了,
4、佇列代碼:
import queue import queue # 帶優先級的佇列,數字越小,優先級越高 q = queue.PriorityQueue() q.put((-1, "car1")) q.put((3, "car2")) q.put((10, "car3")) q.put((6, "car4")) print(q.get()) print(q.get()) print(q.get()) print(q.get()) # 先進先去 q = queue.Queue() q.put("1") q.put("2") q.put("3") print(q.get()) print(q.get()) print(q.get()) # 后進先出,生活中也有這種例子,比如買水果,肯定是買先進的新鮮的水果 q = queue.LifoQueue() q.put(1) q.put(2) q.put(3) print(q.get()) print(q.get()) print(q.get()) # 如果get的次數已經超過了佇列中元素的數量,那么程式就會進入等待,等待佇列中新的元素進入(需要另外一個執行緒添加元素), # 如果不想程式進入等待,可以用get_nowait或者get(block=False),如果佇列為慷訓拋出Empty例外,或者判斷佇列元素empty則不get if not q.empty(): print("從佇列中拿出元素:", q.get()) # print("...1",q.get(block=False)) # print("...2",q.get_nowait())
二、生產者消費者模型:
1、定義:此模型通過一個容器來解決資料生成者和消費者之間的強耦合問題,生成者和消費者之間不直接通信,而通過阻塞佇列來通信,生成者生成資料以后不需要等消費者,只需將資料放到佇列中,消費者也不直接找生產者要資料,而是直接到佇列中取,佇列相當于一個緩沖區,平衡生產和消費者的處理能力,
# 生產消費模型 import queue import threading import time # 生產了10個以后,生產執行緒阻塞,只有消費者消費了一個以后才會繼續生產 q = queue.Queue(maxsize=10) # 生產者 def Producer(name): count = 1 while True: q.put("骨頭%s" % count) print(" 一共生產了骨頭:%s" % count," 目前佇列有:%s" % q.qsize()) count += 1 # 生產的越快,吃的越快 time.sleep(0.1) # 消費者 def Consumer(name): # while q.qsize()>0: while True: print(" [%s] 取到[%s] 并且吃了它..." % (name, q.get())) time.sleep(1) p = threading.Thread(target=Producer, args=("生產者1",)) c = threading.Thread(target=Consumer, args=("用戶1",)) c1 = threading.Thread(target=Consumer, args=("用戶2",)) p.start() c.start() c1.start()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/143481.html
標籤:Python
上一篇:【2020Python修煉記】web框架之 Django框架基礎
下一篇:🤔字串相同ID竟然不同🤔
