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

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控制台输出

Ubuntu控制台输出

Windows控制台输出

Windows控制台输出

差异原因

这个差异本质是Windows和Linux(Ubuntu)的进程创建机制不同:

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:25:53