for循环中的多处理

时间:2020-03-25 16:31:36

标签: python multiprocessing concurrent.futures

我有下面的matching()函数,带有for循环,我向其中传递了一个大的generator(unique_combinations)

处理需要几天的时间,所以我想对循环中的元素使用多处理来加快处理速度,但是我只是不知道该怎么做。

我发现一般很难理解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 个答案:

答案 0 :(得分:1)

如果您已经在使用并发功能,那么IMO最好的方法就是使用map:

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中将其检索以在main中进行循环。文档here