如何在多处理过程中处理池内的多个文件

时间:2017-09-25 21:13:03

标签: python-3.x parallel-processing multiprocessing

我正在尝试处理来自不同文件的多个图像,例如,我正在尝试处理3个文件夹,每个文件夹包含8个卫星图像,对于每个图像,我正在进行4个单独的大气校正(数学方程式)然后保存它们有不同的名字。

以前,我可以将Pool Multiprocessing工具应用于1个文件夹。

从主脚本我使用此函数调用每个文件夹的处理函数

def proceso_lotes(self, path):
    #Flags to choose which atmospheric correction use
    rad  = self.v12.get()
    ref  = self.v22.get()
    dos1 = self.v32.get()
    dos2 = self.v42.get()
    ndvi = self.v52.get()

    start_time = time.time()

    for num_file in range(len(self.new_files)):  #self.new_files is the list that contains the folder name
        print()
        print("Archivo #: ", num_file)
        print("Ruta: ", path)
        print("Nombre de archivo: ", self.new_files[num_file])
        path_mtdt=os.path.join(path, self.new_files[num_file],self.new_files[num_file]+"_MTL.txt" )
        print("Ruta de mtdt: ", path_mtdt)

        #This are the functions that uses the multiprocessing option,
        if rad:
            radiancia_lote(path_mtdt)
        if ref:
            reflectancia_lote(path_mtdt)
        if dos1:
            toados1_lote(path_mtdt)
        if dos2:
            toados2_lote(path_mtdt)


print('TIEMPO TOTAL DE CALCULOS::')
print((time.time() - start_time))

在示例中,让我们调用另一个脚本中的函数radiancia_lote

def radiancia_lote(archivo):

    start_time = time.time()
    print("Archivo: ")
    print(archivo)

    p = Pool(processes=cpu_count())
    p.map(partial(procesar_bandas, archivos=archivo), range(1, 8))
    p.close()
    p.join()
    print('TOTAL TIME TO RAD:')
    print((time.time() - start_time))

这是我使用Pool功能的地方,适用于1个文件(大约4秒),之后我检查Windows任务管理器,我看不到内核工作和下一个文件需要最多70秒或更长时间,如果Pool没有重新开始。

我可以创建一个同时打开3个文件夹的Pool函数,然后调用另一个Pool来处理所有核心已满之前的图像吗?我希望我明白我的想法。 或者我需要使用PoolThreads来完成该任务? 我在python <{1}}上有点新的

我正在使用Python 3.5

0 个答案:

没有答案