我想更改当前使用的池中的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项
答案 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
值进行一些微调,您可以很容易地将其正确化。