python - 使用多处理来预处理图像
问题描述
我试图在 python 中使用多处理来弄湿我的脚。因此,我正在尝试使用多处理来操作图像预处理管道。我的所有图像都在一个名为的目录中image_files
,并且我有一个该目录中所有文件名的列表。我将列表分成两个块a
,b
并将每个块传递给它自己的块,multiprocessing.Process
其中调用的方法preprocess_image
对每个图像进行预处理。
按照关于如何使用多处理计算平方根的教程,我想出了一个工作代码(见下文)。
这段代码有效,但是,速度很重要,我不确定是否适合定义两个基本相同的方法,或者只使用一个方法并简单地将a
和传递b
给multiprocessing.Process(target=work...
.
因此我的问题是这是否是使用多处理的正确方法,或者我是否可以以某种方式加速它?
def work1(array):
for i in tqdm(array):
image_path = "C:/Users/aaron/Desktop/image_files/"+i
image = preprocess_image(image_path)
cv2.imwrite("C:/Users/aaron/Desktop/destination/"+i, image)
def work2(array):
for i in tqdm(array):
image_path = "C:/Users/aaron/Desktop/image_files/"+i
image = preprocess_image(image_path)
cv2.imwrite("C:/Users/aaron/Desktop/destination/"+i, image)
if __name__ == "__main__":
p1 = multiprocessing.Process(target=work1, args=(a,))
p2 = multiprocessing.Process(target=work2, args=(b,))
p1.start()
p2.start()
p1.join()
p2.join()
print("Done!")
解决方案
由于您的所有流程输出似乎都是独立的,因此您应该使用MultiProcessing.Pool
:
from multiprocessing import Pool
l = # list of all your image files
f = # function to modify each of these, taking element of l as input.
p = Pool(10) # however many process you want to spawn
p.map(f, l)
就是这样,您不需要两次定义相同的函数或手动拆分列表。它将为您自动分配和管理。