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

为何Python多进程中get_data()函数未被调用?

解决multiprocessing子进程print输出不显示的问题

你遇到的问题并非get_data()函数未被调用,而是子进程的print输出没有显示在Spyder的控制台中——从最终database列表已成功添加新数据可以看出,两个子进程都正常执行完毕。这是Windows系统下Spyder IDE的输出缓冲特性导致的,以下是几种解决办法:

方法1:强制刷新输出缓冲

在get_data()函数的print语句中添加flush=True参数,强制将输出立即写入控制台:

def get_data(data_list):
    print("Get Data call me!", flush=True)
    for d in data_list:
        print("Why do you not reach here", flush=True)

方法2:通过队列重定向子进程输出

使用multiprocessing.Queue捕获子进程的输出内容,再在主进程中统一打印:

import multiprocessing

def get_data(data_list, output_queue):
    output_queue.put("Get Data call me!")
    for d in data_list:
        output_queue.put(f"Why do you not reach here: {d}")        

def append_data(database, data_list):
    data_list.append(database)

if __name__ == "__main__":   
    print("Start it")
    with multiprocessing.Manager() as manager:
        x = [('A',5),('B',3),('C',3)] 
        database = manager.list( x)
        new_data = ('D',34)
        output_queue = multiprocessing.Queue()
        p1 = multiprocessing.Process(target=append_data, args=(new_data, database))
        p2 = multiprocessing.Process(target=get_data, args=(database, output_queue))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        
        # 打印子进程的输出内容
        while not output_queue.empty():
            print(output_queue.get())
        
        print(f"Data is {database}")
    print("End it")

方法3:修改Spyder控制台设置

打开Spyder的工具 > 偏好设置 > IPython控制台 > 高级,勾选「在独立控制台中运行」选项,子进程的输出会显示在单独的窗口中,避免输出流被主进程捕获而无法显示。

问题根源

Windows系统中multiprocessing默认以spawn方式创建子进程,子进程拥有独立的输出流。Spyder的IPython控制台默认只同步主进程的输出缓冲,子进程的print内容会被暂存,无法自动显示在主控制台中,从而造成函数未被调用的假象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:35:07