多处理for循环?

时间:2013-11-25 11:09:12

标签: python multiprocessing

我有一个数组(称为data_inputs),其中包含数百个天文图像文件的名称。然后操纵这些图像。我的代码工作,需要几秒钟来处理每个图像。但是,它一次只能执行一个图像,因为我通过for循环运行数组:

for name in data_inputs:
    sci=fits.open(name+'.fits')
    #image is manipulated

我没有理由在任何其他图像之前修改图像,因此可以在我的机器上使用所有4个核心,每个核心在不同的图像上运行for循环吗?

我已经阅读了multiprocessing模块,但我不确定如何在我的情况下实现它。 我很想让multiprocessing工作,因为最终我必须在10,000多张图片上运行它。

4 个答案:

答案 0 :(得分:60)

您只需使用multiprocessing.Pool

即可
from multiprocessing import Pool

def process_image(name):
    sci=fits.open('{}.fits'.format(name))
    <process>

if __name__ == '__main__':
    pool = Pool()                         # Create a multiprocessing Pool
    pool.map(process_image, data_inputs)  # process data_inputs iterable with pool

答案 1 :(得分:18)

您可以使用multiprocessing.Pool

from multiprocessing import Pool
class Engine(object):
    def __init__(self, parameters):
        self.parameters = parameters
    def __call__(self, filename):
        sci = fits.open(filename + '.fits')
        manipulated = manipulate_image(sci, self.parameters)
        return manipulated

try:
    pool = Pool(8) # on 8 processors
    engine = Engine(my_parameters)
    data_outputs = pool.map(engine, data_inputs)
finally: # To make sure processes are closed in the end, even if errors happen
    pool.close()
    pool.join()

答案 2 :(得分:0)

或者

with Pool() as pool: 
    pool.map(fits.open, [name + '.fits' for name in datainput])

答案 3 :(得分:0)

如果您仅使用 imap_unordered 循环来迭代可迭代对象,我建议将 chunksizefor 一起使用。它会在计算后立即返回每个循环的结果。 map 等待所有结果计算完毕,因此被阻塞。