如何在Python多线程中按完成顺序依次获取各线程的返回值
Python多线程按任务完成顺序获取返回值实现方案
核心思路:利用线程安全的Queue作为结果中转容器,每个子线程执行完成后主动将返回值写入队列,主线程从队列读取结果时天然遵循先完成先返回的顺序。
修正前代码问题说明
thread.join()方法本身无返回值,原有写法result = thread.join()无法获取到monitor_wrapper的执行结果- 按启动顺序调用
join会导致先完成的后序线程结果无法提前返回
具体修改代码
import threading import queue import time # 初始化线程安全的结果队列 result_queue = queue.Queue() threads = [] for user in users: # 包装原任务函数,执行完成后将结果写入队列,无需修改原monitor_wrapper代码 def wrapped_task(*args): res = monitor_wrapper(*args) result_queue.put(res) task = threading.Thread(target=wrapped_task, args=(user[0], user[1])) threads.append(task) task.start() time.sleep(delay / len(users)) # 按完成顺序获取结果,有多少个线程就取多少次 for _ in range(len(threads)): # get()会自动阻塞直到有新结果进入队列 result = result_queue.get() print(result) # 可选:最后统一join所有线程,确保所有资源释放后再执行后续逻辑 for thread in threads: thread.join()
原理解释
queue.Queue是Python标准库提供的线程安全队列,多线程同时读写不会出现数据混乱- 每个子线程任务执行完成后第一时间将结果写入队列,先完成的任务结果先进入队列
- 主线程循环调用
result_queue.get()时,会按结果入队顺序读取,天然匹配任务完成的先后顺序
内容的提问来源于stack exchange,提问作者MatinMoezi
相关产品推荐
相关产品推荐

