Python 循环的多处理?

Python 循环的多处理?,python,multiprocessing,Python,Multiprocessing,我有一个数组(称为data\u inputs),包含数百个天文图像文件的名称。然后对这些图像进行处理。我的代码工作正常,需要几秒钟来处理每个图像。但是,它一次只能处理一个图像,因为我正在通过for循环运行数组: for name in data_inputs: sci=fits.open(name+'.fits') #image is manipulated 我没有理由必须先修改一个映像,因此是否可以使用我机器上的所有4个内核,每个内核在不同映像上通过for循环运行 我已经阅读

我有一个数组(称为
data\u inputs
),包含数百个天文图像文件的名称。然后对这些图像进行处理。我的代码工作正常,需要几秒钟来处理每个图像。但是,它一次只能处理一个图像,因为我正在通过
for
循环运行数组:

for name in data_inputs:
    sci=fits.open(name+'.fits')
    #image is manipulated
我没有理由必须先修改一个映像,因此是否可以使用我机器上的所有4个内核,每个内核在不同映像上通过for循环运行

我已经阅读了
多处理
模块,但我不确定如何在我的案例中实现它。
我很想让
多处理
发挥作用,因为最终我将不得不在10000多张图像上运行它。

您可以使用
多处理。池

来自多处理导入池的

类引擎(对象):
定义初始化(自身,参数):
self.parameters=参数
定义调用(self,文件名):
sci=fits.open(文件名+'.fits')
操纵=操纵图像(sci,自身参数)
返回操纵
尝试:
池=池(8)#在8个处理器上
发动机=发动机(my_参数)
数据输出=pool.map(引擎、数据输入)
最后:#确保流程最终关闭,即使发生错误
pool.close()
pool.join()
您只需使用:

来自多处理导入池的

def过程_图像(名称):
sci=fits.open(“{}.fits.”格式(名称))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
pool=pool()#创建一个多处理池
pool.map(进程图像、数据输入)#进程数据输入可与池匹配
或者

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

如果您仅使用
for
循环在iterable上迭代,我建议将
imap\u unordered
chunksize
一起使用。一旦计算出每个循环的结果,它就会返回这些结果
map
等待计算所有结果,因此是阻塞的。

最好使用:
pool=pool(os.cpu\u count())
这是一种更通用的使用多处理的方法。注意:
os.cpu\u count()
是在Python 3.4中添加的。对于Python2.x,使用
multiprocessing.cpu\u count()
Pool()
Pool(os.cpu\u count())
来详细说明@Tim的注释-
Pool()
调用时没有
进程的值
Pool(processs=cpu\u count())相同
无论您使用的是Python3还是Python2,因此这两个版本的最佳实践都是使用
Pool()
@LiorMagen,如果我没有弄错的话,使用Pool(os.cpu_count())将使操作系统冻结,直到处理结束,因为您不会给操作系统留下任何空闲内核。对于很多用户来说,池(os.cpu\u count()-1)可能是一个更好的选择。我无法理解这里的“数据输入”是什么。你还没有定义它。我应该给它什么样的值?它实际上来源于alko的回答,我引用了他的评论(参见代码块):“procesdata\u inputs iterable with pool”。因此,
data\u inputs
是一个iterable(就像在标准的
map
中一样)。唯一显示的是可以将函数传递到
pool.map(func,iterable[,chunksize])
。当传递一个对象时,该对象是否会被所有进程共享?因此,我可以让所有进程写入对象中的同一个列表吗?
self.list
。我修好了。
with Pool() as pool: 
    pool.map(fits.open, [name + '.fits' for name in datainput])