python 多執行緒queue導致的死鎖問題

2022-05-17 23:47:10 字數 1650 閱讀 4167

寫了個多執行緒的python指令碼,結果居然死鎖了。除錯了一整天才找到原因,是我使用queue的錯誤導致的。

為了說明問題,下面是乙個簡化版的**。注意,這個**是錯的,後面會說原因和解決辦法。

import

queue

import

threading

queue =queue.queue()

deftest(q):

while

true:

if q.qsize() !=0:

d =q.get()

print

d

else

:

break

defmain():

global

queue

n = 100

for i in range(66):

queue.put(i)

threads =

for i in

range(n)

for i in

range(n):

threads[i].start()

for i in

range(n):

threads[i].join()

上面這個**是會造成死鎖的。原因就在下面這一小段。

while

true:

if q.qsize() !=0:

d = q.get()

由於有多個執行緒同時執行此段**,所以佇列q是各個執行緒共享的。

如果在q只剩乙個資料的時候,有3個執行緒都執行到if q.qsize() != 0:,那麼這3個執行緒都會滿足此條件。從而繼續執行。

然後,在d = q.get()處,只有乙個執行緒能夠取到資料,此後隊列為空,另外兩個執行緒無法取得資料,從而鎖死在此處。

解決方法:加鎖

import

queue

import

threading

queue =queue.queue()mutex=threading.lock()

def

test(q):

global

mutex

while

true:mutex.acquire()if q.qsize() !=0:

d =q.get()mutex.release()print

d

else

:mutex.release()break

defmain():

global

queue

n = 100

for i in range(66):

queue.put(i)

threads =

for i in

range(n)

for i in

range(n):

threads[i].start()

for i in

range(n):

threads[i].join()

python 多執行緒 queue

python的queue設計的是執行緒安全的,所以大傢伙放心用吧!python多執行緒的一種簡單的實現如下 usr bin env python coding utf 8 import threading import time deffun argv print in argv time.slee...

多執行緒queue

一 class queue.queue maxsize 0 佇列 先進先出 import queue q queue.queue q.put first q.put second q.put third print q.get print q.get print q.get 結果 先進先出 firs...

python多執行緒爬蟲學習 Queue

queue是python多執行緒安全的佇列實現,封裝了資料結構中的佇列,保證了執行緒之間使用佇列同步資料不會出錯。也就是說使用queue就不用使用鎖去同步資料。queue預設構造的大小是無限的,也可以在初始化時指定佇列大小 queue q 10 queue的使用函式 get 獲取佇列頭部元素,並且把...