gpt4 book ai didi

python - 如何更改并行进程数?

转载 作者:太空狗 更新时间:2023-10-30 00:10:33 24 4
gpt4 key购买 nike

我有一个并行运行方法的 python 脚本。

parsers = {
'parser1': parser1.process,
'parser2': parser2.process
}

def process((key, value)):
parsers[key](value)

pool = Pool(4)
pool.map(process_items, items)

process_items 是我的方法,items 是一个元组列表,每个元组有两个元素。 items 列表包含大约 10 万个项目。

process_items 将根据给定的参数调用方法。我的问题可能是列表的 70% 我可以以高并行度运行,但其他 30% 只能以 1/2 线程运行,否则将导致我无法控制的故障。

所以在我的代码中我有大约 10 个不同的解析器进程。比如 1-8 我想用 Pool(4) 运行,但是 9-10 Pool(2)。

优化它的最佳方法是什么?

最佳答案

我认为你最好的选择是在这里使用两个池:

from multiprocessing import Pool
# import parsers here

parsers = {
'parser1': parser1.process,
'parser2': parser2.process,
'parser3': parser3.process,
'parser4': parser4.process,
'parser5': parser5.process,
'parser6': parser6.process,
'parser7': parser7.process,
}

# Sets that define which items can use high parallelism,
# and which must use low
high_par = {"parser1", "parser3", "parser4", "parser6", "parser7"}
low_par = {"parser2", "parser5"}

def process_items(key, value):
parsers[key](value)

def run_pool(func, items, num_items, check_set):
pool = Pool(num_items)
out = pool.map(func, (item for item in items if item[0] in check_set))
pool.close()
pool.join()
return out

if __name__ == "__main__":
items = [('parser2', x), ...] # Your list of tuples
# Process with high parallelism
high_results = run_pool(process_items, items, 4, high_par)
# Process with low parallelism
low_results = run_pool(process_items, items, 2, low_par)

尝试一次完成 Pool这是可能的,通过巧妙地使用同步原语,但我认为它最终看起来不会比这更干净。它也可能最终运行效率较低,因为有时您的池需要等待工作完成,因此它可以处理低并行度项目,即使队列中它后面有高并行度项目也是如此。

如果您需要从每个 process_items 中获取结果,这会变得有点复杂按照它们在原始可迭代中的相同顺序调用,这意味着每个 Pool 的结果需要合并,但根据您的示例,我认为这不是必需的。如果是,请告诉我,我会相应地调整我的答案。

关于python - 如何更改并行进程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29776654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com