如何在旅途中更改多处理池工作者的数量

时间:2017-09-14 15:05:04

标签: python-3.x multiprocessing python-multiprocessing

我想更改当前使用的池中的worker数。 我目前的想法是

while True:
    current_connection_number = get_connection_number()
    forced_break = False
    with mp.Pool(current_connection_number) as p:
        for data in p.imap_unordered(fun, some_infinite_generator):
            yield data
            if current_connection_number != get_connection_number():
                forced_break = True
                break
    if not forced_break:
        break

问题在于它只是终止了工作人员,因此从some_infinite_generator获取并且尚未处理的最后项目将丢失。有没有一些标准的方法呢?

编辑:我已经尝试在some_infinite_generator中打印,结果是p.imap_unordered在处理任何事情之前只需要2个池工作人员请求1565个项目,如何限制从生成器请求的项目数?如果我使用上面的代码并仅在2个项目后更改连接数,我将丢失1563项

1 个答案:

答案 0 :(得分:0)

问题是Pool将在单独的线程内部使用生成器。你无法控制这种逻辑。

你能做什么,就是在Pool.imap_unordered方法中为生成器的一部分提供信息,然后根据可用的连接进行缩放。

CHUNKSIZE = 100

while True:
    current_connection_number = get_connection_number()
    with mp.Pool(current_connection_number) as p:
        while current_connection_number == get_connection_number():
            for data in p.imap_unordered(fun, grouper(CHUNKSIZE, some_infinite_generator)):
                yield data

def grouper(n, iterable):
    it = iter(iterable)
    while True:
        chunk = tuple(itertools.islice(it, n))
        if not chunk:
            return
        yield chunk

由于缩放发生在每个块而不是每次迭代时,它的优化程度稍低,但通过对CHUNKSIZE值进行一些微调,您可以很容易地将其正确化。

grouper recipe