如何在内核之间分割python工作?(多处理库)
我有一个顺序函数,可以对列表进行排序并执行任务。例如(这不是实际的代码,但很容易理解)如何在内核之间分割python工作?(多处理库),python,multiprocessing,Python,Multiprocessing,我有一个顺序函数,可以对列表进行排序并执行任务。例如(这不是实际的代码,但很容易理解) 因此,这过于简化了,但本质上这些列表非常大,而且执行顺序非常重要(例如,对于……中的行,),因此我想在系统上的可用内核之间拆分它们 有人能提出这样做的方法吗 从未使用过多处理库,但这可能是与python一起使用的最好方法。您正在寻找 编辑:正如Sidewaise在评论中指出的,最好使用以下模式: from contextlib import closing, cpu_count, Pool with clo
因此,这过于简化了,但本质上这些列表非常大,而且执行顺序非常重要(例如,
对于……中的行,
),因此我想在系统上的可用内核之间拆分它们
有人能提出这样做的方法吗
从未使用过多处理库,但这可能是与python一起使用的最好方法。您正在寻找
编辑:正如Sidewaise在评论中指出的,最好使用以下模式:
from contextlib import closing, cpu_count, Pool
with closing(Pool(processes=cpu_count())) as pool
pass # do something
“执行顺序很重要”,如“需要按顺序完成”,如“不能在核心之间拆分”?一些工作可以拆分-例如,我认为您可以为每个
for
循环拆分工作。但是循环需要一个接一个地执行。@sidewaise您对每一行做了什么?这似乎是唯一一个可以真正并行化的部分,对吗?@dano是的,这是真的。每个循环只是以不同的方式清理列表数据。但我如何将其并行化?我是否需要将这些循环转换为利用多处理库的函数?实际上,Kay,只是为了确认,是sublist_a、sublist_b等输入?例如,类似于调用函数\u到\u进程\u a(子列表\u a)
?子列表\u a
应该是可编辑的<代码>函数\u to\u进程\u a
获取一行作为参数,就像普通的一样。好的,太好了。现在我得到了AttributeError:\uuu退出\uu
。知道为什么会发生这种情况吗?实际上,我尝试将替换为Pool(processs=2)作为Pool
语句,替换为Pool=Pool(processs=2)
,错误是不同的:处理器:线程中的2异常线程-2:回溯(最近一次调用):文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py”,第808行,在\uuuu bootstrap\u internal self.run()文件中,../2.7/lib/python2.7/threading.py“,第761行,在运行PicklingError:Can't pickle:attribute lookup u_内置函数失败
必须使用从contextlib导入关闭
,然后在关闭时将作为池关闭(池(进程=multiprocessing.cpu\u count())
。谢谢,你的回答基本上回答了这个问题。
from multiprocessing import Pool
def function_to_process_a(row):
return row * 42 # or something similar
# replace 4 by the number of cores that you want to utilize
with Pool(processes=4) as pool:
# The lists are processed one after another,
# but the items are processed in parallel.
processed_sublist_a = pool.map(function_to_process_a, sublist_a)
processed_sublist_b = pool.map(function_to_process_b, sublist_b)
processed_sublist_c = pool.map(function_to_process_c, sublist_c)
processed_sublist_d = pool.map(function_to_process_d, sublist_d)
from contextlib import closing, cpu_count, Pool
with closing(Pool(processes=cpu_count())) as pool
pass # do something