Multiprocessing.pool - передать другую переменную в функцию параллелизации - PullRequest
0 голосов
/ 05 ноября 2019

Допустим, у меня есть следующий код:

path = "/my_path/"
filename_ending = '.json'


json_files = [file for file in os.listdir(f"{path}") if file.endswith(filename_ending)]


def read_extracted(name):
    with open(f"/my_path/{name}", 'r') as f:
        return json.load(f)


with mp.Pool(processes=os.cpu_count()-1) as pool:       
    json_list = pool.map(read_extracted, json_files) 

, но я хочу передать другую переменную в функцию read_extracted, которая будет определять путь.

Итак, я хочуфункция должна быть такой (чтобы ее можно было использовать и для других путей):

def read_extracted(name, path):
    with open(f"{path}{name}", 'r') as f:
        return json.load(f)

Однако как тогда эта строка:

json_list = pool.map(read_extracted, json_files) 

должна быть написана для правильной работы?

Есть ли лучший вариант?

1 Ответ

1 голос
/ 05 ноября 2019

У вас есть две опции:

Общая опция - передать итерируемую последовательность (например, кортеж)

json_files_and_path = [(f1, path), (f2, path)]
json_list = pool.map(read_extracted, json_files_and_path)

и изменить сигнатуру функции на

def read_extracted(*args):
  name, path = args

Второй вариант, характерный для вашего случая, - просто передать список полного пути.

json_files = ['path/to/f1', 'path/to/f2']
...