如何将线程执行结果追加至列表?附Python代码及运行结果
如何将线程执行结果追加到列表中
你的现有代码是把Thread对象添加到了threads列表里,所以最后打印的是线程实例而不是执行结果。要获取线程的返回值并收集到列表中,这里有几种实用的方法:
方法1:使用线程安全的共享列表
多个线程同时操作同一个列表时,可能会出现竞态条件,所以我们可以用threading.Lock来保证操作的原子性。修改后的代码如下:
import threading # 定义共享结果列表和线程锁 results = [] lock = threading.Lock() def worker(num): """thread worker function""" result = f'{{Worker: {num}}}' print(result) # 加锁后修改共享列表,避免多线程冲突 with lock: results.append(result) threads = [] for i in range(5): t = threading.Thread(target=worker, args=(i,)) threads.append(t) t.start() # 必须等待所有线程执行完成,再打印结果 for t in threads: t.join() print("线程执行结果:") print(results)
运行后会输出:
{Worker: 0}
{Worker: 1}
{Worker: 2}
{Worker: 3}
{Worker: 4}
线程执行结果:
['{Worker: 0}', '{Worker: 1}', '{Worker: 2}', '{Worker: 3}', '{Worker: 4}']
方法2:用concurrent.futures.ThreadPoolExecutor(更简洁)
如果你的Python版本是3.2及以上,推荐用concurrent.futures模块,它会自动帮你管理线程生命周期和结果收集,代码更清爽:
from concurrent.futures import ThreadPoolExecutor def worker(num): """thread worker function""" result = f'{{Worker: {num}}}' print(result) return result # 创建线程池,最多同时运行5个线程 with ThreadPoolExecutor(max_workers=5) as executor: # 批量提交任务并按输入顺序收集结果 results = list(executor.map(worker, range(5))) print("线程执行结果:") print(results)
这个方法不需要手动处理锁和线程的启动/等待,executor.map会帮你搞定一切,非常适合简单的结果收集场景。
方法3:自定义Thread子类保存结果
如果需要对线程行为做更多自定义,可以继承threading.Thread,在子类里保存返回值:
import threading class ResultThread(threading.Thread): def __init__(self, num): super().__init__() self.num = num self.result = None def run(self): """重写run方法,执行线程逻辑并保存结果""" self.result = f'{{Worker: {self.num}}}' print(self.result) threads = [] for i in range(5): t = ResultThread(i) threads.append(t) t.start() # 等待所有线程完成后,从每个线程实例中提取结果 results = [] for t in threads: t.join() results.append(t.result) print("线程执行结果:") print(results)
这种方式适合需要扩展线程功能的场景,每个线程实例会独立保存自己的执行结果,最后统一收集即可。
内容的提问来源于stack exchange,提问作者meh
相关产品推荐
相关产品推荐

