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

Jupyter Notebook中Python多进程代码无法正常运行求助

问题描述

我是Python新手,使用Anaconda Python 3.9学习多进程知识。运行以下代码时,在Jupyter Notebook中仅输出mainfunc: 已启动和mainfunc: 已结束,子进程的打印内容未显示;但在使用Anaconda Python 3.9虚拟环境的Visual Studio Code中,该代码可正常执行。请求帮忙排查问题原因。

代码(已翻译注释与输出文本):

from multiprocessing import Process # 导入所需库
import time

def subfunc1():
    time.sleep(2)
    print("subfunc1: 已启动")
    time.sleep(2)
    print("subfunc1: 已结束")
    time.sleep(2)

def subfunc2():
    time.sleep(2)
    print("subfunc2: 已启动")
    time.sleep(2)
    print("subfunc2: 已结束")
    time.sleep(2)
    
def mainfunc():
    print("mainfunc: 已启动")
    pr1 = Process(target=subfunc1)
    pr2 = Process(target=subfunc2)
    pr1.start()
    pr2.start()
    print("mainfunc: 已结束")
    
if __name__ == '__main__': # 仅在主代码块中调用主函数!
    mainfunc()

问题原因及解决办法

核心原因

Jupyter Notebook与普通Python脚本的运行机制存在差异:

  • Jupyter的主进程输出定向到Notebook前端,但子进程的标准输出(print内容)不会自动关联到Notebook的输出流,导致内容无法显示。
  • 主进程启动子进程后直接结束,未等待子进程执行完毕,Jupyter环境下主进程退出会直接终止子进程,而VS Code的终端环境会默认等待子进程完成。

解决步骤

  1. 等待子进程执行完成
    在mainfunc中添加join()方法,让主进程等待所有子进程执行完毕再退出,这是最直接的解决方式:
def mainfunc():
    print("mainfunc: 已启动")
    pr1 = Process(target=subfunc1)
    pr2 = Process(target=subfunc2)
    pr1.start()
    pr2.start()
    # 等待子进程执行完成
    pr1.join()
    pr2.join()
    print("mainfunc: 已结束")
  1. 用队列传递子进程输出(可选)
    如果上述方法仍无法显示输出,可通过Queue实现进程间通信,让子进程把输出内容传递给主进程打印:
from multiprocessing import Process, Queue
import time

def subfunc1(q):
    time.sleep(2)
    q.put("subfunc1: 已启动")
    time.sleep(2)
    q.put("subfunc1: 已结束")
    time.sleep(2)

def subfunc2(q):
    time.sleep(2)
    q.put("subfunc2: 已启动")
    time.sleep(2)
    q.put("subfunc2: 已结束")
    time.sleep(2)
    
def mainfunc():
    print("mainfunc: 已启动")
    q = Queue()
    pr1 = Process(target=subfunc1, args=(q,))
    pr2 = Process(target=subfunc2, args=(q,))
    pr1.start()
    pr2.start()
    
    # 从队列获取子进程输出并打印
    for _ in range(4):
        print(q.get())
    
    pr1.join()
    pr2.join()
    print("mainfunc: 已结束")
    
if __name__ == '__main__':
    mainfunc()

补充说明

VS Code中运行普通Python脚本时,主进程与子进程共享终端的标准输出流,所以子进程的print内容能正常显示,且主进程会默认等待子进程完成后再退出。Jupyter环境下优先使用join()方法即可解决大部分问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:24:09