2013-11-25 137 views
23

我有一个数组(称为data_inputs)包含数百个天文图像文件的名称。这些图像然后被操纵。我的代码工作并需要几秒钟来处理每个图像。但是,它只能在同一时间做一个形象,因为我跑的阵列通过“for”循环:python多处理for循环

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

没有理由为什么我在任何其他修改的图像,因此,它是可以利用我的机器上的所有4个内核,每个内核在不同的映像上运行for循环?

我读过关于多处理模块,但我不确定如何在我的情况下实现它。 我很想让多处理工作,因为最终我必须在10,000个以上的图像上运行这个。

回答

36

您可以简单地使用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) # proces data_inputs iterable with pool 
+3

它可能会更好使用: 'pool = Pool(os.cpu_count())' 这是使用多处理的更通用的方法。 –

+1

注意:在Python 3.4中添加了'os.cpu_count()'。对于Python 2.x,使用'multiprocessing.cpu_count()'。 – dwj

+2

'Pool()'与'Pool(os.cpu_count())'相同' – Tim

13

您可以使用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() 
+0

我无法理解什么是 “data_inputs” 在这里。你还没有定义它。我应该给它什么价值? –

+0

它实际上源于alko的回答,我引用了他的评论(请参阅代码块):“处理data_inputs可与池迭代”。所以'data_inputs'是一个可迭代的(就像在一个标准的'map'中)。 – ponadto