You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python线程结束时触发线程安全的回调函数

线程安全的线程结束回调实现方案

标准Python的threading.Thread类并没有finished.connect这类信号绑定方法,下面提供几种线程安全的实现方案,覆盖不同场景需求:

方案1:自定义线程类,子线程内执行回调

通过重写线程的run方法,在目标任务执行完成(包括异常场景)后直接调用回调。回调会在子线程内部执行,只要回调本身是线程安全的(如不操作未加锁的共享资源),整个流程就线程安全。

import threading

def do_work():
    print("子线程工作中...")

def thread_finished():
    print("线程结束,回调执行")

class CallbackThread(threading.Thread):
    def __init__(self, target=None, callback=None, args=(), kwargs=None):
        super().__init__(target=target, args=args, kwargs=kwargs or {})
        self.callback = callback

    def run(self):
        try:
            # 执行目标任务
            if self._target is not None:
                self._target(*self._args, **self._kwargs)
        finally:
            # 无论任务是否抛出异常,都保证回调被调用
            if self.callback is not None:
                self.callback()

# 使用示例
my_thread = CallbackThread(target=do_work, callback=thread_finished)
my_thread.start()
my_thread.join()

方案2:主线程中执行回调(适合操作主线程资源场景)

如果回调需要操作主线程专属资源(如GUI组件),可以用线程池的add_done_callback方法,回调会被自动调度到主线程执行,天然避免线程安全问题。

import concurrent.futures

def do_work():
    print("子线程工作中...")

def thread_finished(future):
    print("线程结束,回调执行(主线程环境)")

# 使用线程池管理任务
with concurrent.futures.ThreadPoolExecutor() as executor:
    future = executor.submit(do_work)
    # 绑定回调,任务完成后自动触发
    future.add_done_callback(thread_finished)

方案3:队列实现跨线程回调通知

对于需要集中处理多个线程回调的场景,用线程安全的队列传递回调信号,由专门的线程(或主线程)处理回调逻辑,完全避免资源竞争。

import threading
import queue

def do_work(callback_queue):
    print("子线程工作中...")
    # 任务完成后向队列发送回调触发信号
    callback_queue.put("task_completed")

def callback_processor(callback_queue):
    while True:
        signal = callback_queue.get()
        if signal == "task_completed":
            print("线程结束,回调执行")
        callback_queue.task_done()

# 创建线程安全的队列
callback_q = queue.Queue()

# 启动回调处理线程(设为守护线程随主线程退出)
processor_thread = threading.Thread(target=callback_processor, args=(callback_q,), daemon=True)
processor_thread.start()

# 启动工作线程
my_thread = threading.Thread(target=do_work, args=(callback_q,))
my_thread.start()
my_thread.join()
callback_q.join()

内容的提问来源于stack exchange,提问作者Manoj gowda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:15:00