Python 在多cpu环境下并行处理大量函数
我想创建一个函数,在给定函数列表和相关参数的情况下,启动尽可能多的进程以并行化这些任务。正在运行的进程数不能超过我的CPU核心数。当一个过程结束时,应该用另一个过程替换它,直到结束 我尝试使用python池实现这样一个东西。以下是我的功能:Python 在多cpu环境下并行处理大量函数,python,python-2.7,parallel-processing,multiprocessing,Python,Python 2.7,Parallel Processing,Multiprocessing,我想创建一个函数,在给定函数列表和相关参数的情况下,启动尽可能多的进程以并行化这些任务。正在运行的进程数不能超过我的CPU核心数。当一个过程结束时,应该用另一个过程替换它,直到结束 我尝试使用python池实现这样一个东西。以下是我的功能: from multiprocessing import Pool, cpu_count CPUS = cpu_count() def parallelize(functions, args): results = [] if CPUS &
from multiprocessing import Pool, cpu_count
CPUS = cpu_count()
def parallelize(functions, args):
results = []
if CPUS > 1:
for i in xrange(0, len(functions), CPUS):
pool = Pool()
for j in xrange(CPUS):
if i + j >= len(functions):
break
results.append(pool.apply_async(functions[i + j], args = args[i + j]))
pool.close()
pool.join()
map(lambda x: x.get(), results)
else:
for i in xrange(len(functions)):
results.append(functions[i](*args[i]))
return results
此实现将函数列表细分为块。每个批量维度等于实际CPU的数量。问题在于,它实际上会等待每一批函数完成,然后再次启动另一批进程。我不希望出现这种行为,因为如果批量中有一个非常慢的函数,其他CPU将在启动新进程之前等待它完成
正确的方法是什么?看起来你把事情复杂化了<代码>多处理。池将始终按照您告诉它的进程数运行,无论您给它分配了多少个工作项。因此,如果您创建
池(CPU)
,池
将永远不会同时运行超过CPU
任务,即使您为其提供CPU*100
任务。因此,在不做任何特殊工作的情况下,永远不要运行超过CPU数量的任务,这就满足了您的要求。因此,您可以迭代整个方法和参数列表,对它们调用apply\u async
,而不必担心成批调用。池
将执行所有任务,但一次执行的任务不得超过CPU
任务:
def parallelize(methods, args):
results = []
if CPUS > 1:
pool = Pool(CPUS)
for method, arg in zip(methods, args):
results.append(pool.apply_async(method, args=arg))
pool.close()
pool.join()
out = map(lambda x: x.get(), results)
else:
for i in xrange(len(methods)):
results.append(methods[i](*args[i]))
return results
@dano
methods
是一个函数列表。因此方法[i+j]
是一个函数。怎么了?啊,对不起。我想这是因为某种原因。别理我:)哦,比我想象的简单。非常感谢。