在Python中,可以使用queue
模塊中的Queue
類來實現線程安全的隊列。Queue
類內部使用了鎖(Lock)和條件變量(Condition)來確保線程安全。這意味著當你使用多線程并行地向隊列中添加或從隊列中取出元素時,隊列會正確地處理并發訪問,避免了競爭條件和其他并發問題。
下面是一個簡單的示例,展示了如何使用Queue
類實現線程安全的隊列:
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()
在這個示例中,我們創建了一個生產者線程和一個消費者線程。生產者線程將數字0到4放入隊列中,而消費者線程從隊列中取出這些數字并打印它們。通過使用Queue
類,我們確保了這兩個線程可以安全地訪問隊列,而不會發生競爭條件。
注意,在消費者線程中,我們使用了q.task_done()
方法來通知隊列該任務已完成。這對于Queue.join()
方法很有用,因為它會阻塞直到隊列中的所有任務都已完成。在這個示例中,我們在生產者線程完成后向隊列中添加了一個None
對象,以通知消費者線程退出循環并結束執行。