使用多处理加速python程序执行
试图更好地理解多重处理以及如何将其用于以下场景 我有一个包含100000张图片的文件夹。我有一个python脚本,它获取每个图像,对图像执行一些操作,并将结果存储到另一个目录中 图像上的每个操作都需要5秒钟 我的问题如下: 当脚本在单个图像上执行时。如果我使用top命令查看cpu统计数据,我可以看到我的cpu或内存都不是100%(这是一个多核处理器) 此外,通过在不同的shell中启动许多python脚本,我可以每分钟处理更多的图像 以什么样的方式更快地完成这项任务?如果图像数量增加,如何水平缩放使用多处理加速python程序执行,python,multithreading,unix,multiprocessing,distributed-computing,Python,Multithreading,Unix,Multiprocessing,Distributed Computing,试图更好地理解多重处理以及如何将其用于以下场景 我有一个包含100000张图片的文件夹。我有一个python脚本,它获取每个图像,对图像执行一些操作,并将结果存储到另一个目录中 图像上的每个操作都需要5秒钟 我的问题如下: 当脚本在单个图像上执行时。如果我使用top命令查看cpu统计数据,我可以看到我的cpu或内存都不是100%(这是一个多核处理器) 此外,通过在不同的shell中启动许多python脚本,我可以每分钟处理更多的图像 以什么样的方式更快地完成这项任务?如果图像数量增加,如何水平缩
任何资源/评论都会有所帮助 您可以使用
asyncio
库并发处理图像。您只需定义一个事件循环,将任务注册到事件循环中即可。系统决定下一步运行哪个。当任务受I/O限制(在您的情况下,将值存储到系统中的某个地方)或等待某个地方的响应时,系统从事件循环中选择另一个任务,而不是等待,依此类推
打开/读取/写入文件的I/O操作是导致cpu空闲的操作 在处理图像时,通常需要矩阵乘法,占用大量cpu资源,并且可以基于cpu核并行完成(给定或获取2*核) 我的建议是根据任务使用不同的线程池,对于处理文件,您可以创建任意多个线程,而不会造成太多性能降级,但是处理映像(即使用字节数组进行计算)可以扩展到cpu内核,在这一点上,您应该注意到性能降级 我建议使用worker队列模式 您还可以查看事件循环实现,由于它的非阻塞特性,它可能会产生更好的结果,您可以找到示例
请记住,为了充分利用cpu核心,您应该创建多个事件循环线程,每个核心一个(或两个),线程在cpu核心上自动缩放(大多数操作系统)您可以使用
binge
(pip install binge
)-它是一个通用多处理包装器:
def image_worker(image_path, output_path):
(load image, process, and save)
return None
img_paths = ['./img1.png',
'./img2.png',
...
'./img100000.png']
from binge import B
result = B(worker, cores=4)(img_paths, '../otherfolder/')
其中cores
是将使用的进程数。结果将是image_worker的返回值列表,即非的列表
cf:请参见此链接的示例: