如何在Python中接收執行緒回撥?


多執行緒是程式設計中一個強大的概念,允許開發者併發執行多個任務,從而提高程式的整體效能。在Python中,threading模組提供了一種方便的方式來實現多執行緒。在使用執行緒時,通常需要接收回調來處理事件或同步不同執行緒的執行。在本教程中,我們將探討在Python中接收執行緒回撥的各種技術。

Python中的執行緒

在深入研究執行緒回撥之前,讓我們簡要回顧一下Python中執行緒的基礎知識。threading模組提供了一個高階介面來建立和管理執行緒。執行緒是共享相同記憶體空間但獨立執行的輕量級程序。

示例

這是一個在Python中建立和執行執行緒的簡單示例:

import threading

def my_function():
   print("This is a thread.")

# Create a thread
my_thread = threading.Thread(target=my_function)

# Start the thread
my_thread.start()

# Wait for the thread to finish
my_thread.join()

輸出

This is a thread.

執行緒回撥的必要性

在使用執行緒時,通常會遇到一個執行緒需要通知另一個執行緒特定事件或任務完成的情況。這就是執行緒回撥變得至關重要的原因。執行緒回撥是一種機制,透過它一個執行緒可以執行指定的函式以響應另一個執行緒中的事件。

現在讓我們討論在Python中接收執行緒回撥的技術。

使用事件進行執行緒回撥

實現執行緒回撥的一種方法是使用threading模組中的Event類。事件是一個簡單的同步原語,允許一個執行緒向另一個執行緒發出訊號,表明某個事件已發生。

示例

讓我們考慮一個示例,其中工作執行緒執行任務並使用事件向主執行緒發出訊號:

import threading
import time

def worker(callback_event):
   print("Worker is performing a task.")
   time.sleep(2)
   callback_event.set()

def callback_function():
   print("Callback received: Task is complete!")

if __name__ == "__main__":
   # Create an event to signal the callback
   callback_event = threading.Event()

   # Create a thread with the worker function and pass the callback event
   worker_thread = threading.Thread(target=worker, args=(callback_event,))

   # Start the worker thread
   worker_thread.start()

   # Wait for the callback event to be set
   callback_event.wait()

   # Perform the callback action
   callback_function()

   # Wait for the worker thread to finish
   worker_thread.join()

輸出

在這個例子中,工作執行緒執行一個任務並將callback_event設定為向主執行緒發出訊號。主執行緒等待事件被設定,然後執行callback_function。

Worker is performing a task.
Callback received: Task is complete!

使用佇列進行執行緒回撥

接收執行緒回撥的另一種方法是使用佇列。queue模組中的Queue類提供了一種執行緒安全的方式來線上程之間交換資料。

示例

考慮以下示例,其中工作執行緒將訊息放入佇列中,主執行緒檢索並處理該訊息:

import threading
import queue
import time

def worker(callback_queue):
   print("Worker is performing a task.")
   time.sleep(2)
   callback_queue.put("Task is complete!")

def callback_function(message):
   print(f"Callback received: {message}")

if __name__ == "__main__":
   # Create a queue for callbacks
   callback_queue = queue.Queue()

   # Create a thread with the worker function and pass the callback queue
   worker_thread = threading.Thread(target=worker, args=(callback_queue,))

   # Start the worker thread
   worker_thread.start()

   # Wait for the worker thread to finish
   worker_thread.join()

   # Retrieve and process the callback message
   callback_message = callback_queue.get()
   callback_function(callback_message)

輸出

在這個例子中,工作執行緒將訊息放入callback_queue中,主執行緒使用callback_function檢索並處理該訊息。

Worker is performing a task.
Callback received: Task is complete!

在事件和佇列之間進行選擇

選擇使用事件還是佇列進行執行緒回撥取決於您需要交換的資料的複雜性和程式的同步要求。

  • 事件 - 事件適用於執行緒之間的簡單訊號傳遞。如果您只需要通知另一個執行緒已發生特定事件,則事件提供了一種輕量級的解決方案。

  • 佇列 - 佇列更加通用,可以處理執行緒之間更復雜的通訊。如果您需要線上程之間交換資料或訊息,則佇列提供了一種執行緒安全且高效的機制。

處理多個回撥

在實際應用中,您可能會遇到多個執行緒需要註冊和接收回調的情況。這可以透過維護回撥列表並在需要時對其進行迭代來實現。

示例

讓我們修改之前的示例來處理多個回撥:

import threading
import queue
import time

def worker(callbacks):
   print("Worker is performing a task.")
   time.sleep(2)
   for callback in callbacks:
      callback.put("Task is complete!")

def callback_function(message):
   print(f"Callback received: {message}")

if __name__ == "__main__":
   # Create a list of queues for callbacks
   callback_queues = [queue.Queue() for _ in range(3)]

   # Create a thread with the worker function and pass the callback queues
   worker_thread = threading.Thread(target=worker, args=(callback_queues,))

   # Start the worker thread
   worker_thread.start()

   # Wait for the worker thread to finish
   worker_thread.join()

   # Retrieve and process the callback messages
   for callback_queue in callback_queues:
      callback_message = callback_queue.get()
      callback_function(callback_message)

輸出

在這個修改後的示例中,我們建立了一個佇列列表(callback_queues)並將其傳遞給工作執行緒。工作執行緒迭代該列表,將訊息放入每個佇列中。然後,主執行緒從每個佇列檢索並處理訊息。

Worker is performing a task.
Callback received: Task is complete!
Callback received: Task is complete!
Callback received: Task is complete!

結論

在Python中實現執行緒回撥涉及根據應用程式的要求選擇合適的機制。無論您選擇事件還是佇列,理解threading模組提供的同步原語對於編寫健壯的多執行緒程式碼至關重要。

更新於:2024年2月15日

1K+ 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告