回調函數是一種通過函數指針(或引用)調用的函數,它在特定事件或條件發生時被另一個函數調用。回調函數的核心思想是將函數作為參數傳遞,以便在適當的時候執行自定義邏輯,常用于異步編程、事件驅動架構等場景。
業務場景及示例
1. 事件處理(如GUI按鈕點擊)
在圖形界面中,用戶點擊按鈕后觸發特定操作。
# 示例:模擬事件處理器
class Button:def __init__(self):self.click_handlers = [] # 保存回調函數的列表def add_click_handler(self, handler):self.click_handlers.append(handler)def click(self):print("按鈕被點擊了!")for handler in self.click_handlers:handler() # 執行所有注冊的回調函數# 定義回調函數
def show_message():print("彈出提示:操作成功!")# 使用
button = Button()
button.add_click_handler(show_message)
button.add_click_handler(lambda: print("記錄日志:按鈕點擊事件")) # 使用Lambda表達式
button.click()# 輸出:
# 按鈕被點擊了!
# 彈出提示:操作成功!
# 記錄日志:按鈕點擊事件
2. 異步任務完成后的處理
例如,下載文件完成后自動處理數據。
import time
import threading# 模擬異步下載
def download_file(url, callback):def download_task():print(f"開始下載 {url}...")time.sleep(2) # 模擬耗時操作data = f"下載內容:{url}"callback(data) # 下載完成后調用回調處理數據threading.Thread(target=download_task).start() # 啟動新線程# 定義回調函數:處理下載結果
def process_data(data):print(f"處理數據: {data}")# 使用
download_file("https://example.com/data.csv", process_data)
print("下載進行中,主線程繼續運行...") # 非阻塞# 輸出:
# 開始下載 https://example.com/data.csv...
# 下載進行中,主線程繼續運行...
# (2秒后)處理數據: 下載內容:https://example.com/data.csv
3. 定時任務調度
在指定時間后執行回調(如定時提醒)。
import time
from threading import Timer# 定義定時器回調
def schedule_task(delay, callback):def task():time.sleep(delay)callback()Timer(0, task).start() # 啟動定時線程# 回調函數:定時任務內容
def remind():print("提醒:會議將在5分鐘后開始!")# 使用
schedule_task(10, remind) # 10秒后觸發提醒
print("定時器已設置,主線程繼續工作...")# 輸出:
# 定時器已設置,主線程繼續工作...
# (10秒后)提醒:會議將在5分鐘后開始!
回調函數的優勢
- 解耦邏輯:將觸發邏輯與處理邏輯分離。
- 靈活性:允許動態擴展功能(如插件系統)。
- 異步支持:適用于I/O密集型任務(如網絡請求)。
注意事項
過度使用回調可能導致“回調地獄”(嵌套層次深),此時可改用 Promise
或 async/await
(Python 的 asyncio
)。