如何在Python中利用多进程与共享内存协同加速图像预处理?

胖萱君_3365

胖萱君_3365

2026-09-22

809人浏览

原创

应优先使用sharedmemory+numpy.ndarray实现图像共享,因其支持显式内存控制和安全数组映射;multiprocessing.array因仅限一维、无对齐保障且易越界而不适用。

如何在python中利用多进程与共享内存协同加速图像预处理?

直接用 multiprocessing.Arraymultiprocessing.shared_memory.SharedMemory 做图像预处理共享,90% 的人会卡在内存对齐或进程同步上——不是共享失败,就是读出乱码或崩溃。核心问题不在“能不能共享”,而在“怎么让多个进程安全、零拷贝地访问同一块图像数据”。

为什么不能直接用 multiprocessing.Array 存整张图

multiprocessing.Array 只支持一维基础类型(如 'B' 表示 uint8),而图像本质是三维数组(H×W×C)或二维(灰度图)。强行 flatten 再 reshape 容易出错:

  • 不同进程 reshape 时若维度不一致(比如一个用 (128,128),另一个误写成 (128,128,1)),结果数据错位但不报错
  • Array 不自动管理字节序和内存对齐,OpenCV 或 PIL 读取时可能触发 ValueError: buffer is not C-contiguous
  • 单个 Array 最大长度受系统限制(Linux 默认约 2GB),处理 4K 图像批量时极易越界

SharedMemory + numpy.ndarray 是更稳的选择

Python 3.8+ 的 multiprocessing.shared_memory.SharedMemory 允许你显式控制内存块大小和生命周期,配合 numpy.ndarraybuffer 参数可安全映射为图像数组:

  • 先计算所需字节数:size = height * width * channels * np.dtype('uint8').itemsize
  • 主进程创建共享内存:shm = SharedMemory(create=True, size=size, name='img_buffer')
  • np.ndarray(shape, dtype, buffer=shm.buf) 构造视图,所有子进程复用同一 name 打开即可
  • 务必在所有进程结束后手动调用 shm.close()shm.unlink(),否则内存泄漏

示例关键片段:

Shadows Python Sensei
Shadows Python Sensei

Python 最佳实践助手——代码规范、设计模式、性能优化、测试与类型注解。适用于编写或审查 Python 代码。

下载
import numpy as np
from multiprocessing import Process, shared_memory
from PIL import Image
<p>def worker(shm_name, shape):
existing_shm = shared_memory.SharedMemory(name=shm_name)
img_array = np.ndarray(shape, dtype=np.uint8, buffer=existing_shm.buf)</p><h1>此处做 resize / convert 等操作,直接修改 img_array 即写入共享内存</h1><pre class="brush:python;toolbar:false;">existing_shm.close()

主进程

shape = (128, 128) size = int(np.prod(shape)) # 灰度图 shm = shared_memory.SharedMemory(create=True, size=size) img_view = np.ndarray(shape, dtype=np.uint8, buffer=shm.buf)

加载原始图并拷入共享内存

raw_img = np.array(Image.open('input.jpg').convert('L').resize(shape)) np.copyto(img_view, raw_img) # 必须用 copyto,不能直接赋值

p = Process(target=worker, args=(shm.name, shape)) p.start() p.join()

shm.close() shm.unlink() # 关键:不 unlink 会导致下次运行报 OSError: File exists

实际图像流水线中,共享内存只适合中间数据,别碰输入/输出

图像预处理的 I/O 阶段(读文件、写文件)天然不适合共享——磁盘带宽和文件锁会成为瓶颈。共享内存真正起效的位置是「CPU密集型中间态」:

  • 输入阶段:每个进程各自 Image.open()cv2.imread(),独立加载(避免竞争)
  • 共享阶段:把加载后的 np.ndarray 拷入共享内存,供多个进程并行做滤波、直方图均衡、二值化等
  • 输出阶段:各进程从共享内存读出结果,再各自保存(cv2.imwritenp.save),不共享磁盘路径

如果强行让所有进程共用一个输入文件句柄或输出目录,大概率触发 OSError: [Errno 11] Resource temporarily unavailable 或文件损坏。

最易被忽略的一点:共享内存本身不提供同步机制。如果你有多个进程同时读写同一片区域(比如做图像分块处理),必须显式加 multiprocessing.Lock,否则像素值会随机覆盖——这种 bug 很难复现,但线上跑几万张图后才会暴露。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1551

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3664

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1569

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

20897

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2587

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2647

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1063

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

576

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2043

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程