为何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
相关产品推荐
相关产品推荐

