在Python中,多線程編程可以通過threading
模塊來實現。線程間的通信是指在一個線程中運行的程序需要與其他線程中運行的程序共享數據或信息。Python提供了多種方法來實現線程間的通信,以下是其中的一些常用方法:
Queue
模塊:Queue
模塊提供了一個線程安全的隊列類,可以在多個線程之間傳遞數據。這是一個簡單的例子:
import threading
import queue
import time
def worker(q):
while True:
item = q.get()
if item is None:
break
print(f"Worker: {item}")
time.sleep(1)
q.task_done()
q = queue.Queue()
for i in range(5):
q.put(i)
threads = []
for _ in range(2):
t = threading.Thread(target=worker, args=(q,))
t.start()
threads.append(t)
q.join() # 等待所有任務完成
for _ in range(len(threads)):
q.put(None) # 通知線程退出
for t in threads:
t.join()
Event
模塊:Event
模塊提供了一個線程同步原語,可以用來通知其他線程某個事件已經發生。這是一個簡單的例子:
import threading
import time
def worker(e):
while True:
e.wait() # 等待事件發生
print("Worker: Event occurred")
time.sleep(1)
e = threading.Event()
t = threading.Thread(target=worker, args=(e,))
t.start()
time.sleep(2) # 讓工作線程等待一段時間
e.set() # 設置事件,通知工作線程
t.join()
Condition
模塊:Condition
模塊提供了一個線程同步原語,可以用來在多個線程之間協調對共享資源的訪問。這是一個簡單的例子:
import threading
import time
class Counter:
def __init__(self):
self.value = 0
self.cond = threading.Condition()
def increment(self):
with self.cond:
self.value += 1
print(f"Counter: {self.value}")
self.cond.notify_all() # 通知所有等待的線程
def worker(counter):
while True:
with counter.cond:
while counter.value == 0:
counter.cond.wait() # 等待計數器變為非零
counter.value -= 1
print(f"Worker: {counter.value}")
counter = Counter()
threads = []
for _ in range(3):
t = threading.Thread(target=worker, args=(counter,))
t.start()
threads.append(t)
for _ in range(10):
counter.increment()
time.sleep(1)
for t in threads:
t.join()
這些方法都可以用來實現線程間的通信。你可以根據具體的需求選擇合適的方法。