如何通过输入输出队列获取Python Thread类的线程执行结果
核心问题根源
- 你的工作线程
run方法仅执行1次任务拉取逻辑就退出,8个线程最多只能处理8个任务,剩余2个任务始终停留在输入队列无人消费,这是缺失8、9执行结果的核心原因 - 结果队列没有配套调用
task_done方法,直接调用results_queue.join()会永远阻塞 - 直接单次调用
results_queue.get()只能拿到第一个完成的任务结果,自然只会输出0 - 提前判断队列为空会跳过还没来得及写入队列的结果,导致无输出或者输出不全
修正后完整实现
from threading import Thread from queue import Queue class SimulationThread(Thread): def __init__(self, input_queue: Queue, results_queue: Queue): super().__init__() self.input_queue = input_queue self.results_queue = results_queue def run(self) -> None: # 循环拉取任务,直到收到终止标记None while True: data = self.input_queue.get() # 收到毒丸标记,终止线程 if data is None: self.input_queue.task_done() break try: # 这里替换为你的实际模拟逻辑 self.results_queue.put(data) finally: self.input_queue.task_done() N = 10 # 总任务数 NP = 8 # 工作线程数 input_queue = Queue() results_queue = Queue() # 启动工作线程 workers = [] for _ in range(NP): worker = SimulationThread(input_queue, results_queue) worker.daemon = True worker.start() workers.append(worker) # 投放所有任务 for i in range(N): input_queue.put(i) # 给每个线程投放一个终止毒丸,通知所有线程任务全部投放完成可以退出 for _ in range(NP): input_queue.put(None) # 等待所有任务处理完成 input_queue.join() # 直接按总任务数拉取所有结果,不需要判空 results = [results_queue.get() for _ in range(N)] print(results)
关键修改说明
- 工作线程增加循环拉取逻辑,单个线程可以处理多个任务,解决线程资源浪费、任务处理不全的问题
- 用毒丸模式(投放None作为终止标记)通知线程退出,逻辑简单可靠,不需要额外的状态判断
- 输入队列的
join()会等待所有get对应的task_done调用完成,保证所有任务处理完毕后再拉取结果,不会出现提前判空漏拿结果的问题 - 已知总任务数为N,直接拉取N次结果队列即可,不需要做复杂的非空判断逻辑
- 线程调度顺序由操作系统决定,输出结果的顺序不一定和任务投放顺序一致,如果需要保序可以在投放任务时附带序号,收集结果后按序号重排
内容的提问来源于stack exchange,提问作者CiaranWelsh
相关产品推荐
相关产品推荐

