多处理for循环?

Chr*_*Fro 54 python multiprocessing

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

for name in data_inputs:
    sci=fits.open(name+'.fits')
    #image is manipulated
Run Code Online (Sandbox Code Playgroud)

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

我已经阅读了关于multiprocessing模块的内容,但我不确定如何在我的情况下实现它.我渴望开始multiprocessing工作,因为最终我必须在10,000多张图片上运行它.

alk*_*lko 74

你可以简单地使用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
Run Code Online (Sandbox Code Playgroud)

  • `Pool()`与`Pool(os.cpu_count())`相同 (12认同)
  • 使用它可能更好:`pool = Pool(os.cpu_count())`这是一种使用多处理的更通用的方法. (10认同)
  • 要详细说明@Tim的注释 - ````````````````````````````````````````````````````````````````````````````````` EITHER版本是使用`Pool()`.https://docs.python.org/2/library/multiprocessing.html (9认同)
  • @LiorMagen,如果我没弄错的话,使用Pool(os.cpu_count())将使操作系统冻结,直到处理结束,因为你没有给操作系统留下任何免费核心.对于很多用户来说,Pool(os.cpu_count() - 1)可能是更好的选择 (4认同)
  • 注意:`os.cpu_count()` 是在 Python 3.4 中添加的。对于 Python 2.x,使用 `multiprocessing.cpu_count()`。 (2认同)

小智 20

你可以使用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()
Run Code Online (Sandbox Code Playgroud)

  • 我无法理解这里的“data_inputs”是什么。你还没有定义它。我应该给它什么值? (3认同)
  • 它实际上源于 alko 的回答,我引用了他的评论(请参阅代码块):“proces data_inputs iterable with pool”。所以“data_inputs”是一个可迭代的(就像标准的“map”一样)。 (2认同)

Spa*_*pas 6

或者

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

  • 抱歉,我的错误是“pool.map”而不仅仅是“pool”。我修好了它。 (4认同)