Python multiprocessing:并行执行3个函数并获取返回值问题
为什么并行执行函数后返回值都是None?
嘿,这个问题我之前踩过坑!大概率是你用的并行方式(比如threading.Thread或者multiprocessing.Process)本身不会直接保存函数的执行结果,直接去拿自然就是None啦~ 我来给你拆解常见的错误场景和解决办法:
常见错误写法示例
比如你可能用了threading.Thread,写法类似这样:
import threading def func1(): return "first result" def func2(): return "second result" def func3(): return "third result" # 启动线程 t1 = threading.Thread(target=func1) t2 = threading.Thread(target=func2) t3 = threading.Thread(target=func3) t1.start() t2.start() t3.start() t1.join() t2.join() t3.join() # 错误尝试获取结果 first = t1.run() # 这里拿到的就是None! second = t2.run() third = t3.run()
为什么会这样?因为Thread对象的run()方法只是负责执行目标函数,但不会保存它的返回值;而且当你调用join()之后线程已经跑完了,再调用run()也拿不到之前线程执行的结果,自然返回None。
如果用multiprocessing.Process,情况也是一样的——它同样不会帮你存储函数的返回结果。
解决办法:用高层API或共享容器捕获返回值
方法1:用concurrent.futures(推荐,简洁直观)
不管是线程还是进程并行,concurrent.futures都能统一处理,而且原生支持获取返回值:
from concurrent.futures import ThreadPoolExecutor # CPU密集型任务可以换成ProcessPoolExecutor def func1(): return "first result" def func2(): return "second result" def func3(): return "third result" with ThreadPoolExecutor(max_workers=3) as executor: # 提交每个任务,拿到Future对象 future1 = executor.submit(func1) future2 = executor.submit(func2) future3 = executor.submit(func3) # 从Future对象里获取返回值(会阻塞直到任务完成) first = future1.result() second = future2.result() third = future3.result() print(first, second, third) # 现在就能拿到正确的结果啦!
方法2:用共享容器(比如队列、字典)
如果坚持用基础的Thread或Process,可以用线程/进程安全的容器来传递结果:
比如用multiprocessing.Queue处理多进程场景:
import multiprocessing # 给函数加个参数,用来传递队列 def func1(queue): result = "first result" queue.put(result) def func2(queue): result = "second result" queue.put(result) def func3(queue): result = "third result" queue.put(result) if __name__ == "__main__": queue = multiprocessing.Queue() p1 = multiprocessing.Process(target=func1, args=(queue,)) p2 = multiprocessing.Process(target=func2, args=(queue,)) p3 = multiprocessing.Process(target=func3, args=(queue,)) p1.start() p2.start() p3.start() p1.join() p2.join() p3.join() # 从队列里取出结果(注意顺序要和任务提交顺序对应) first = queue.get() second = queue.get() third = queue.get() print(first, second, third)
核心原因总结
基础的Thread和Process类的设计目标是执行任务,而不是收集任务结果——它们不会自动保存目标函数的返回值。想要拿到结果,要么用更高层的API(比如ThreadPoolExecutor/Pool),要么自己用线程/进程安全的数据结构来传递结果。
内容的提问来源于stack exchange,提问作者Fab
相关产品推荐
相关产品推荐

