Python 執行緒 佇列 阻塞佇列解耦合

2021-09-05 09:28:00 字數 1787 閱讀 9821

# encoding=utf-8

import threading

import time

try: # python2中

from queue import queue

except modulenotfounderror: # python3中

from queue import queue

"""python的queue模組中提供了同步的、執行緒安全的佇列類,

包括fifo(先入先出)佇列queue,lifo(後入先出)佇列lifoqueue,和優先順序佇列priorityqueue。

這些佇列都實現了鎖原語(可以理解為原子操作,即要麼不做,要麼就做完),能夠在多執行緒中直接使用。

可以使用佇列來實現執行緒間的同步。

queue使用

對於queue,在多執行緒通訊之間扮演重要的角色

新增資料到佇列中,使用put()方法

從佇列中取資料,使用get()方法

判斷佇列中是否還有資料,使用qsize()方法

為什麼要使用生產者和消費者模式

在多執行緒開發當中,如果生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。

同樣的道理,如果消費者的處理能力大於生產者,那麼消費者就必須等待生產者。

為了解決這個問題於是引入了生產者和消費者模式。

什麼是生產者消費者模式

生產者消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。

生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,

直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列裡取,阻塞佇列就相當於乙個緩衝區,

平衡了生產者和消費者的處理能力。

這個阻塞佇列就是用來給生產者和消費者解耦的。縱觀大多數設計模式,都會找乙個第三者出來進行解耦,

用fifo佇列實現生產者與消費者問題的**如下:

"""class producer(threading.thread):

def run(self):

global queue

count = 0

while true:

if queue.qsize() < 1000:

for i in range(100):

count = count + 1

msg = '生成產品' + str(count)

queue.put(msg)

print(msg)

time.sleep(0.5)

class consumer(threading.thread):

def run(self):

global queue

while true:

if queue.qsize() > 100:

for i in range(3):

msg = self.name + '消費了 ' + queue.get()

print(msg)

time.sleep(1)

if __name__ == '__main__':

queue = queue()

for i in range(500):

queue.put('初始產品' + str(i))

for i in range(2):

p = producer()

p.start()

for i in range(5):

c = consumer()

c.start()

執行緒安全的佇列 阻塞佇列

queue佇列 先進先出,兩個執行緒同時操作同乙個佇列,執行緒是不安全的 blockingqueue阻塞佇列 先進先出,執行緒是安全,阻塞佇列中維護了鎖,用於進出佇列。一般阻塞佇列用於生產者和消費者模式。arrayblockingqueue 1 基於陣列的阻塞佇列。2 維護的是定長陣列,初始化的時候...

多執行緒 阻塞佇列

blockingqueue最終會有四種狀況,丟擲異常 返回特殊值 阻塞 超時,下表總結了這些方法 丟擲異常 特殊值阻塞 超時插入add e offer e put e offer e,time,unit 移除remove poll take poll time,unit 檢查element peek...

執行緒通訊 阻塞佇列

1 blockingqueue 阻塞佇列 當生產者試圖向blockingqueue中放入元素時,如果該佇列已滿,則該執行緒被阻塞,當消費者試圖從佇列中取出元素,當隊列為空時阻塞。主要方法 1 法向blockingqueue中插入null,否則丟擲nullpointerexception 2 不僅可以...