在Python中,可以使用queue
模塊中的Queue
類來實(shí)現(xiàn)線程安全的隊(duì)列。Queue
類內(nèi)部使用了鎖(Lock)和條件變量(Condition)來確保線程安全。這意味著當(dāng)你使用多線程并行地向隊(duì)列中添加或從隊(duì)列中取出元素時(shí),隊(duì)列會(huì)正確地處理并發(fā)訪問,避免了競(jìng)爭(zhēng)條件和其他并發(fā)問題。
下面是一個(gè)簡(jiǎn)單的示例,展示了如何使用Queue
類實(shí)現(xiàn)線程安全的隊(duì)列:
import threading
from queue import Queue
import time
def producer(q):
for i in range(5):
q.put(i)
print(f"Produced {i}")
time.sleep(1)
def consumer(q):
while True:
item = q.get()
if item is None:
break
print(f"Consumed {item}")
time.sleep(2)
q.task_done()
if __name__ == "__main__":
q = Queue()
prod_thread = threading.Thread(target=producer, args=(q,))
cons_thread = threading.Thread(target=consumer, args=(q,))
prod_thread.start()
cons_thread.start()
prod_thread.join()
q.put(None) # Signal the consumer to exit
cons_thread.join()
在這個(gè)示例中,我們創(chuàng)建了一個(gè)生產(chǎn)者線程和一個(gè)消費(fèi)者線程。生產(chǎn)者線程將數(shù)字0到4放入隊(duì)列中,而消費(fèi)者線程從隊(duì)列中取出這些數(shù)字并打印它們。通過使用Queue
類,我們確保了這兩個(gè)線程可以安全地訪問隊(duì)列,而不會(huì)發(fā)生競(jìng)爭(zhēng)條件。
注意,在消費(fèi)者線程中,我們使用了q.task_done()
方法來通知隊(duì)列該任務(wù)已完成。這對(duì)于Queue.join()
方法很有用,因?yàn)樗鼤?huì)阻塞直到隊(duì)列中的所有任務(wù)都已完成。在這個(gè)示例中,我們?cè)谏a(chǎn)者線程完成后向隊(duì)列中添加了一個(gè)None
對(duì)象,以通知消費(fèi)者線程退出循環(huán)并結(jié)束執(zhí)行。