Python大数据集多进程处理:Win10与Ubuntu表现差异解析
多进程跨系统运行差异问题
我为完成学校任务编写了以下Python代码,用来验证多进程处理大数据集(示例为图像像素元组列表)比单进程更高效,但发现同一代码在Win10和Ubuntu系统上表现不同:Ubuntu中两个进程会同时启动,而Win10中第二个进程要等第一个完成后才启动,想知道这个差异的原因。
验证代码
from PIL import Image from multiprocessing import Pool, Process import time img = Image.open('sunflower.jpg') data = [x for x in img.getdata()] new_image = Image.new("RGB", img.size) new_image_data = [] def convert_pixels(pixel): r, g, b = pixel gray = int((r + g + b) / 3) gray = (gray, gray, gray) return gray def convert_pixels_mp(pixels): start_time = time.time() p = Pool(6) result = p.map(convert_pixels, pixels) new_image_data.append(result) p.close() p.join() end_time = time.time() - start_time print(f"Processing took {end_time[0:4]}s") def convert_pixels_sp(pixels): print("======Process started======") start_time = time.time() for i in pixels: result = convert_pixels(i) new_image_data.append(result) end_time = str(time.time() - start_time) print(f"Processing took {end_time[0:5]}s") def save_image(): new_image.putdata(new_image_data) new_image.save("gray.jpg") if __name__ == "__main__": print("\n**Single core process**\n") p3 = Process(target=convert_pixels_sp, args=(data,)) p3.start() p3.join() print("\nMultiprocessing with usage of 2 cores\n") # data sets l1 = data[0: int(len(data) / 2)] l2 = data[int(len(data) / 2):] # processing same data with usage of 2 cores p1 = Process(target=convert_pixels_sp, args=(l1,)) p1.start() p2 = Process(target=convert_pixels_sp, args=(l2,)) p2.start() p1.join() p2.join() # save new image save_image()
系统控制台输出
Ubuntu控制台输出

Windows控制台输出

差异原因
这个差异本质是Windows和Linux(Ubuntu)的进程创建机制不同:
- Ubuntu(Linux)采用fork机制:调用
Process.start()时,系统会通过fork()系统调用直接复制父进程的内存空间、运行状态,子进程几乎能立即开始执行任务,所以两个子进程会同时启动,控制台会同步输出启动信息,并行处理数据。 - Windows采用spawn机制:Windows没有
fork()调用,Python的多进程模块会启动一个全新的Python解释器,重新加载整个脚本(直到if __name__ == "__main__"分支才会执行目标函数),这个过程需要加载依赖、初始化环境,开销远大于fork。当连续启动两个进程时,第一个进程先完成初始化并开始处理任务,而第二个进程还在启动准备阶段,等第一个进程处理完时,第二个才完成初始化开始执行,所以会出现先后启动的视觉效果。
内容的提问来源于stack exchange,提问作者ath4nosis
相关产品推荐
相关产品推荐

