我正在尝试在python中使用多处理来弄湿我的脚。因此,我尝试使用多处理来操作图像预处理管道。我的所有图像都放在一个名为a
的目录中,并且列出了该目录中所有文件名。我将列表分为两个块b
和multiprocessing.Process
,并将每个块传递给它自己的preprocess_image
,其中称为a
的方法在每个图像上进行预处理。
在关于如何使用多重处理计算平方根的教程之后,我想到了一个有效的代码(见下文)。
此代码有效,但是速度很重要,我不确定定义两个基本相同的方法是否合适,或者仅使用单个方法并简单地传递b
和{ {1}}到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!")
答案 0 :(得分:1)
由于所有过程输出似乎都是独立的,因此应使用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)
就是这样,您不需要定义相同的函数两次或手动拆分列表。它将自动为您分配和管理。