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

如何在Jupyter Notebook中使用Python多进程时让print语句生效

解决Jupyter Notebook中多进程外部函数print无输出的问题

Jupyter Notebook的主进程和多进程子进程的输出流相互独立,直接在外部模块函数里使用print时,子进程的输出无法被Jupyter前端捕获,因此看不到内容。以下是几种可行的解决方法:

方法1:用队列传递输出(最可靠)

通过multiprocessing.Queue让子进程把输出内容传递到主进程,再由主进程负责打印。

外部py文件(示例命名为my_funcs.py):

def func(x, output_queue=None):
    msg = f'Running for {x}'
    # 有队列则放入消息,否则直接打印(兼容非多进程场景)
    if output_queue:
        output_queue.put(msg)
    else:
        print(msg)
    return x * x

Jupyter Notebook代码:

from multiprocessing import Pool, Queue
from my_funcs import func
import threading

# 读取队列并打印的线程函数
def print_output(queue):
    while True:
        content = queue.get()
        if content is None:  # 收到结束信号就停止
            break
        print(content)

# 创建队列和打印线程
output_queue = Queue()
printer_thread = threading.Thread(target=print_output, args=(output_queue,))
printer_thread.start()

# 启动多进程执行任务
with Pool() as pool:
    results = pool.starmap(func, [(x, output_queue) for x in range(5)])

# 发送结束信号,等待打印线程完成
output_queue.put(None)
printer_thread.join()

print("最终结果:", results)

方法2:改用logging模块输出

用Python的logging模块替代print,它能更好地处理多进程环境下的输出同步问题。

外部py文件:

import logging

# 配置子进程的日志格式
logging.basicConfig(level=logging.INFO, format="%(message)s")
logger = logging.getLogger(__name__)

def func(x):
    logger.info(f'Running for {x}')
    return x * x

Jupyter Notebook代码:

import logging
from multiprocessing import Pool
from my_funcs import func

# 主进程配置日志,确保输出能被Jupyter捕获
logging.basicConfig(level=logging.INFO, format="%(message)s")

with Pool() as pool:
    results = pool.map(func, range(5))

print("最终结果:", results)

方法3:重定向子进程的stdout(部分环境有效)

通过初始化子进程,将其标准输出重定向到主进程的标准输出,不过这种方法在部分Jupyter环境中可能不稳定。

外部py文件:

import sys

# 子进程初始化函数,重定向stdout
def init_worker():
    sys.stdout = sys.__stdout__

def func(x):
    print(f'Running for {x}')
    return x * x

Jupyter Notebook代码:

from multiprocessing import Pool
from my_funcs import func, init_worker

# 创建Pool时指定初始化函数
with Pool(initializer=init_worker) as pool:
    results = pool.map(func, range(5))

print("最终结果:", results)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:30:06