Как запустить пакетную обработку 5 файлов одновременно, а затем продолжить со следующими 5 файлами, которые находятся в списке? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть некоторый код, где у меня есть список с некоторым файлом .bat в них, где я позже выполню каждый из этих файлов bat одновременно.Однако я хотел бы выполнить только 5 за один раз, а затем, как только обработка будет завершена, он переходит к следующим 5 в этом списке.

for ProcProfileCFG in ProcProfileCFGs
     IETrajBatFile = ProcProfileCFG[3]
     ProcProfileFile = ProcProfileCFG[2]

#This command then runs all of the bat files with in ProcProfileCFGs at once
#where x[3] is the bat file name i.e. "IE_trajectory.bat"
res = Pool().amap(os.system, ['powershell.exe ./' + x[3] for x in ProcProfileCFGs])

Так что я просто хочу, чтобы он выполнил этокоманда для первых 5 файлов, чтобы они все запускались одновременно, затем, как только эти файлы были завершены, запускаются следующие 5 одновременно, и так далее, и так далее, пока все они не пройдут.Вместо всего того, что он сейчас делает.

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Вы можете указать количество рабочих при создании пула.

with Pool(5) as p:
        p.map(func, list)
        p.close()
        p.join()

Обратите внимание, что он не будет работать с теми же 5 файлами одновременно и перейти к следующим 5 файлам по порядку.Но он создает очередь с 5 работниками, и когда работник готов, начинается другой.Это гарантирует, что за один раз будут обрабатываться только 5 файлов.

0 голосов
/ 04 марта 2019

Разрезать заполнение пакетного файла на куски

Импорт многопроцессорной обработки

def handle_batch_file(file_name):
    # dummy code
    # print(file_name)
    return file_name


BATCH_SIZE = 5

BATCH_FILES = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']


def main():
    p = multiprocessing.Pool(BATCH_SIZE)
    counter = 0
    while True:
        sub_list = BATCH_FILES[counter * BATCH_SIZE: (counter + 1) * BATCH_SIZE]
        print('Calling "map" with sub list {}'.format(sub_list))
        dummy_results = p.map(handle_batch_file, sub_list)
        if len(BATCH_FILES) <= (counter + 1) * BATCH_SIZE:
            break
        counter += 1


if __name__ == "__main__":
    main()

Вывод

Calling "map" with sub list ['a', 'b', 'c', 'd', 'e']
Calling "map" with sub list ['f', 'g', 'h', 'i', 'j']
Calling "map" with sub list ['k', 'l', 'm', 'n']
0 голосов
/ 04 марта 2019

Используйте multiprocessing.Пример для чтения CSVs с именем file1.csv, file2.csv и т. Д .:

import multiprocessing

output=[]
data = range(0,len(files))

def f(x):
    pd.read_csv(file_name+x+'.csv')

def mp_handler():
    p = multiprocessing.Pool(64)
    r=p.map(f, data)
    return r

if __name__ == '__main__':
    output.append(mp_handler())
...