Python的佇列queue在多執行緒中的應用

2021-10-19 08:04:20 字數 2620 閱讀 5395

import threading

import time

from queue import queue

class producer(threading.thread):

def __init__(self):

threading.thread.__init__(self)

def run(self):

count = 0

while true:

if queue.qsize() < 300:

for i in range(300):

# count += 1

count = count + 1

msg = self.name + '生產產品' + str(count)

queue.put(msg)

print(msg)

time.sleep(0.5)

class consumer(threading.thread):

def __init__(self):

threading.thread.__init__(self)

def run(self):

while true:

if queue.qsize() > 100:

for i in range(3):

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

print(msg)

time.sleep(1) # 即同一執行緒消費三個會休息1s

if __name__ == '__main__':

queue = queue()

for i in range(100):

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

for i in range(2):

p = producer() # 雖然有兩個執行緒但是仍然是執行緒1寫一次後執行緒2寫,佇列具有原子性,即要麼不做,要麼做完

p.start()

for i in range(5):

c = consumer() # 建立5個消費者執行緒則執行緒名稱會從thread-3開始,因為有兩個生產者執行緒將1和2占用了

c.start()

消費佇列返回:

thread-3消費了thread-1生產產品2541

thread-3消費了thread-1生產產品2542

thread-3消費了thread-1生產產品2543

thread-7消費了thread-1生產產品2544

thread-7消費了thread-1生產產品2545

thread-7消費了thread-1生產產品2546

thread-6消費了thread-1生產產品2547

thread-6消費了thread-1生產產品2548

thread-6消費了thread-1生產產品2549

thread-5消費了thread-1生產產品2550

thread-5消費了thread-1生產產品2551

thread-5消費了thread-1生產產品2552

thread-4消費了thread-1生產產品2553

thread-4消費了thread-1生產產品2554

thread-4消費了thread-1生產產品2555

生產佇列返回:

thread-1生產產品2985

thread-1生產產品2986

thread-1生產產品2987

thread-1生產產品2988

thread-1生產產品2989

thread-1生產產品2990

thread-1生產產品2991

thread-1生產產品2992

thread-1生產產品2993

thread-1生產產品2994

thread-1生產產品2995

thread-1生產產品2996

thread-1生產產品2997

thread-1生產產品2998

thread-1生產產品2999

thread-1生產產品3000

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

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

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

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

生產者消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列裡取,阻塞佇列就相當於乙個緩衝區,平衡了生產者和消費者的處理能力。

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

其實生產與消費模式中,對於消費者來說都是去獲取資料,多一層解耦個人理解對消費者影響其實有限,主要是對生產者,比如消費者消費慢,那生產者是給消費者還是不給,是否需要暫停生產,等等都是問題,而有了第三方佇列,生產者則無需關心消費者消費快慢的問題,只需安心生產,消費者消費慢了可以多加幾個消費者,消費快了可以延時消費。就如同飯店的飯菜如果直接給到某個具體的消費者,消費者吃的慢,乙個勁兒的上,勢必消費不完,如果放到某個地兒讓消費者自取或者邀請朋友一起去取,則能控制消費速度。

Python程式設計 queue佇列

import queue q1 queue.queue q1.put 1 q1.put 2 q1.put 3 print q1.get print q1.get print q1.get 1 2 3import queue q2 queue.lifoqueue q2.put 1 q2.put 2 q...

python訊息佇列Queue

例項1 訊息佇列queue,不要將檔案命名為 queue.py 否則會報異常 importerror cannot import name queue coding utf 8 from multiprocessing import queue q queue 3 初始化乙個queue物件,最多可接...

Python 佇列模組 Queue

佇列queue模組 管道 subprocess stdin stdout stderr 佇列 管道 鎖 佇列 先進先出 堆疊 先進後出 from multiprocessing import queue 建立乙個佇列 q queue 5 括號內可以傳數字 標示生成的佇列最大可以同時存放的資料量 往佇...