我怎样才能对一个函数进行数千次多处理?

How can I multiprocess a single function thousands of time?

我正在使用 OpenCV 将数千张图像与一张参考图像进行比较。这个过程非常漫长,我正在考虑将多处理作为加速它的一种方式。

我应该怎么做才能让它为每个图像执行“cv.matchTemplate(...)”函数,而不是在同一图像上循环重新执行该函数?

def myFunction():
    
    values_for_each_image =[]
    
    for image in thousands_of_images:
        result = cv.matchTemplate(reference_image, image, cv.TM_CCOEFF_NORMED)
        
        values_for_each_image.append(result[1])
     
     return values_for_each_image

理论上,我知道我可以做这样的事情(但对于成千上万的图像来说这是不现实的):

def do_image1():
    return cv.matchTemplate(reference_image, image1, cv.TM_CCOEFF_NORMED)

def do_image2():
    return cv.matchTemplate(reference_image, image2, cv.TM_CCOEFF_NORMED)

p1 = multiprocessing.Process(target=do_image1)
p2 = multiprocessing.Process(target=do_image2)

if __name__ ==  '__main__':
    p1.start()
    p2.start()
...

您可以使用 python 的多处理库中的 Pool,而不是单个进程。池将根据需要负责启动每个进程。

鉴于您的函数没有任何参数,我想说您可以使用池的 apply or the apply_async 函数获得最佳结果。

这就是我使用 concurrent.futures:

解决问题的方法
from concurrent.futures import ThreadPoolExecutor, as_completed

def do_image(reference_image, image):
    return(cv.matchTemplate(reference_image, image, cv.TM_CCOEFF_NORMED))

def myFunction():
    values_for_each_image = []
    with ThreadPoolExecutor(20) as executor:
        results = {executor.submit(do_image, reference_image, image) for image in thousands_of_images}
        for result in as_completed(results):
            values_for_each_image.append(result.result())
    return(values_for_each_image)