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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:43:31