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的终端环境会默认等待子进程完成。
解决步骤
- 等待子进程执行完成
在mainfunc中添加join()方法,让主进程等待所有子进程执行完毕再退出,这是最直接的解决方式:
def mainfunc(): print("mainfunc: 已启动") pr1 = Process(target=subfunc1) pr2 = Process(target=subfunc2) pr1.start() pr2.start() # 等待子进程执行完成 pr1.join() pr2.join() print("mainfunc: 已结束")
- 用队列传递子进程输出(可选)
如果上述方法仍无法显示输出,可通过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
相关产品推荐
相关产品推荐

