使用多处理加速python程序执行

使用多处理加速python程序执行,python,multithreading,unix,multiprocessing,distributed-computing,Python,Multithreading,Unix,Multiprocessing,Distributed Computing,试图更好地理解多重处理以及如何将其用于以下场景 我有一个包含100000张图片的文件夹。我有一个python脚本,它获取每个图像,对图像执行一些操作,并将结果存储到另一个目录中 图像上的每个操作都需要5秒钟 我的问题如下: 当脚本在单个图像上执行时。如果我使用top命令查看cpu统计数据,我可以看到我的cpu或内存都不是100%(这是一个多核处理器) 此外,通过在不同的shell中启动许多python脚本,我可以每分钟处理更多的图像 以什么样的方式更快地完成这项任务?如果图像数量增加,如何水平缩

试图更好地理解多重处理以及如何将其用于以下场景

我有一个包含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:

请参见此链接的示例: