Многопроцессорная обработка в цикле for - PullRequest
1 голос
/ 25 марта 2020

У меня есть функция ниже matching() с для l oop, на которую я передаю большое generator(unique_combinations).

Требуются дни для обработки, поэтому я хотел использовать многопроцессорность для элементов в l oop, чтобы ускорить процесс, но я просто не могу понять, как это сделать.

Мне трудно понять логику c за concurrent.futures в целом.

    results = []
    match_score = []

    def matching():    
        for pair in unique_combinations:        
            if fuzz.ratio(pair[0], pair[1]) > 90:    
                results.append(pair)    
                match_score.append(fuzz.ratio(pair[0], pair[1]))

    def main():    
        executor = ProcessPoolExecutor(max_workers=3)    
        task1 = executor.submit(matching)    
        task2 = executor.submit(matching)    
        task3 = executor.submit(matching)

    if __name__ == '__main__':
        main()

print(results)
print(match_score)

Я предполагаю, что это должно ускорить выполнение.

1 Ответ

1 голос
/ 25 марта 2020

Если вы уже используете concurrent.futures, наилучшим способом, IMO, является использование карты:

import concurrent.futures

def matching(pair):
    fuzz_ratio = fuzz.ratio(pair[0], pair[1])  # only calculate this once
    if fuzz_ratio  > 90:    
        return pair, fuzz_ratio
    else:
        return None


def main():
    unique_combinations = [(1, 2), (2, 3), (3, 4)]
    with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
        for result in executor.map(matching, unique_combinations, chunksize=100):
            if result:
                # handle the results somehow
                results.append(result[0])
                match_score.append(results[1])


if __name__ == '__main__':
    main()

Существует множество способов обработки результатов, но суть в том, что вы возвращаете значение из matching, а затем получить его в executor.map для l oop в main. Документы здесь .

...