python隊列基本使用

做用:
   解耦:使程序直接實現鬆耦合,修改一個函數,不會有串聯關係。
   提升處理效率:FIFO = 現進先出,LIFO = 後入先出。
 
隊列:
  隊列能夠併發的派多個線程,對排列的線程處理,並切每一個須要處理線程只須要將請求的數據放入隊列容器的內存中,線程不須要等待,當排列完畢處理完數據後,線程在準時來取數據便可。請求數據的線程只與這個隊列容器存在關係,處理數據的線程down掉不會影響到請求數據的線程,隊列會派給其餘線程處理這分數據,它實現瞭解耦,提升效率。隊列內會有一個有順序的容器,列表與這個容器是有區別的,列表中數據雖然是排列的,但數據被取走後還會保留,而隊列中這個容器的數據被取後將不會保留。當必須在多個線程之間安全地交換信息時,隊列在線程編程中特別有用。
 
Python四種類型的隊例:
Queue:FIFO 即first in first out 先進先出
LifoQueue:LIFO 即last in first out 後進先出
PriorityQueue:優先隊列,級別越低,越優先
deque:雙邊隊列


導入三種隊列,包
from queue import Queue,LifoQueue,PriorityQueue

 

Queue 先進先出隊列:html

#基本FIFO隊列 先進先出 FIFO即First in First Out,先進先出 #maxsize設置隊列中,數據上限,小於或等於0則不限制,容器中大於這個數則阻塞,直到隊列中的數據被消掉
q = Queue(maxsize=0) #寫入隊列數據
q.put(0) q.put(1) q.put(2) #輸出當前隊列全部數據
print(q.queue) #刪除隊列數據,並返回該數據
q.get() #輸也全部隊列數據
print(q.queue) # 輸出: # deque([0, 1, 2]) # deque([1, 2])

 

LifoOueue 後進先出隊列:編程

#LIFO即Last in First Out,後進先出。與棧的相似,使用也很簡單,maxsize用法同上
lq = LifoQueue(maxsize=0) #隊列寫入數據
lq.put(0) lq.put(1) lq.put(2) #輸出隊列全部數據
print(lq.queue) #刪除隊尾數據,並返回該數據
lq.get() #輸出隊列全部數據
print(lq.queue) #輸出: # [0, 1, 2] # [0, 1]

 

優先隊列:安全

 

# 存儲數據時可設置優先級的隊列
# 優先級設置數越小等級越高
pq = PriorityQueue(maxsize=0)

#寫入隊列,設置優先級
pq.put((9,'a'))
pq.put((7,'c'))
pq.put((1,'d'))

#輸出隊例所有數據
print(pq.queue)

#取隊例數據,能夠看到,是按優先級取的。
pq.get()
pq.get()
print(pq.queue)

#輸出:
[(9, 'a')]

 

雙邊隊列:併發

#雙邊隊列
dq = deque(['a','b'])

#增長數據到隊尾
dq.append('c')
#增長數據到隊左
dq.appendleft('d')

#輸出隊列全部數據
print(dq)
#移除隊尾,並返回
print(dq.pop())
#移除隊左,並返回
print(dq.popleft())
#輸出:
deque(['d', 'a', 'b', 'c'])
c
d

 

 

生產消費模型:app

#生產消費模型
qq = Queue(maxsize=10) def product(name): count = 1
    while True: q.put('步槍{}'.format(count)) print('{}生產步槍{}支'.format(name,count)) count+=1 time.sleep(0.3) def cousume(name): while True: print('{}裝備了{}'.format(name,q.get())) time.sleep(0.3) q.task_done() #部隊線程
p = threading.Thread(target=product,args=('張三',)) k = threading.Thread(target=cousume,args=('李四',)) w = threading.Thread(target=cousume,args=('王五',)) p.start() k.start() w.start()
相關文章
相關標籤/搜索