Python 在多cpu环境下并行处理大量函数

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 &

我想创建一个函数,在给定函数列表和相关参数的情况下,启动尽可能多的进程以并行化这些任务。正在运行的进程数不能超过我的CPU核心数。当一个过程结束时,应该用另一个过程替换它,直到结束

我尝试使用python池实现这样一个东西。以下是我的功能:

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]
是一个函数。怎么了?啊,对不起。我想这是因为某种原因。别理我:)哦,比我想象的简单。非常感谢。