首页 > 解决方案 > Python 多个进程消耗/迭代单个生成器(分而治之)

问题描述

我有一个 python 生成器,它返回很多项目,例如:

import itertools

def generate_random_strings():
    chars = "ABCDEFGH"
    for item in itertools.product(chars, repeat=10):
        yield "".join(item)

然后我对此进行迭代并执行各种任务,问题是我只为此使用一个线程/进程:

my_strings = generate_random_strings()
for string in my_strings:
    # do something with string...
    print(string)

这很好用,我得到了所有的字符串,但是速度很慢。我想利用 Python 多处理的力量来“分而治之”这个 for 循环。但是,当然,我希望每个字符串只处理一次。虽然我找到了很多关于多处理的文档,但我正在尝试用最少的代码找到最简单的解决方案。我假设每个线程每次都应该获取一大块项目并在返回并获得另一个大块之前处理它们......

非常感谢,

标签: pythonpython-3.xmultiprocessinggeneratorpython-multiprocessing

解决方案


代码最少的最简单的解决方案?多处理上下文管理器。

我假设您可以将“用字符串做某事”放入一个名为“do_something”的函数中

from multiprocessing import Pool as ProcessPool

number_of_processes = 4

with ProcessPool(number_of_processes) as pool:
    pool.map(do_something, my_strings)

如果您想再次获得“do_something”的结果,很简单!

with ProcessPool(number_of_processes) as pool:
    results = pool.map(do_something, my_strings)

你会在一个列表中找到它们。

Multiprocessing.dummy 是进程池的语法包装器,可让您使用多处理语法。如果您想要线程而不是进程,只需执行以下操作:

from multiprocessing.dummy import Pool as ThreadPool

推荐阅读