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

在Jupyter Notebook中Python多进程无法输出预期打印结果的问题

解决Jupyter Notebook多进程无法输出预期数值的问题

核心问题出在Jupyter的进程隔离特性,加上普通变量无法跨进程共享,导致你看不到子进程的计算结果。以下是具体原因和可行解决方案:

常见原因

  1. 普通数据结构不支持进程共享:如果你的代码用了普通dict存结果,子进程修改的只是自身内存里的副本,主进程完全感知不到,最后只能输出空的{}。
  2. Jupyter运行环境差异:和普通.py脚本不同,Jupyter的代码在临时模块中执行,子进程启动时会重新加载模块,全局变量无法被正确继承(Windows系统下更明显,因为多进程用spawn方式完全重启解释器)。

解决方案

方案1:用multiprocessing.Manager创建共享字典

把普通字典换成Manager提供的进程安全字典,子进程的修改会同步到主进程:

import multiprocessing
import time

def calculate(numbers, result):
    # 示例计算逻辑:求和并存入字典
    total = sum(numbers)
    result["total"] = total
    time.sleep(0.1)

# 必须加这个判断,避免子进程重复执行代码(Windows下尤为重要)
if __name__ == "__main__":
    numbers = [2,3,5,4]  # 求和结果为14
    # 创建进程共享的字典
    with multiprocessing.Manager() as manager:
        result_dict = manager.dict()
        p = multiprocessing.Process(target=calculate, args=(numbers, result_dict))
        p.start()
        p.join()  # 等待子进程执行完成
        print(result_dict["total"])  # 输出14
        print(result_dict)  # 输出{'total': 14}

方案2:用Queue传递计算结果

如果不需要共享字典,用队列传递结果更直接:

import multiprocessing
import time

def calculate(numbers, q):
    total = sum(numbers)
    q.put(total)
    time.sleep(0.1)

if __name__ == "__main__":
    numbers = [2,3,5,4]
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target=calculate, args=(numbers, q))
    p.start()
    p.join()
    total = q.get()
    print(total)  # 输出14
    print({})  # 对应讲师代码里的空字典输出

额外提醒

  • 在Jupyter里测试多进程,务必把所有代码放在同一个cell里,并且加上if __name__ == "__main__",否则子进程会重复执行cell代码,引发意外行为。
  • 永远不要用全局变量跨进程传数据,必须用官方提供的进程间通信工具(Manager、Queue、Pipe等)。

内容的提问来源于stack exchange,提问作者Sevanna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:25:10