Python多处理使用池增加时间延迟

时间:2014-09-16 16:24:47

标签: python multiprocessing python-3.3 pool

我必须使用启发式算法(例如蚂蚁算法)来解决复杂的网络优化问题。该算法分两步进行分解:1。)使用随机分量计算新的解决方案,2。)评估新的解决方案。这两个部分非常耗时,并解决了在子程序中使用多处理并行的问题。随着迭代次数的增加,步骤的持续时间增加得非常快。我定位了并行进程初始化(标签timeMainCalculatetimeMainEvaluate)与第一个子程序开始(标签timeSubCalculatetimeSubEvaluate)之间的时间延迟。在第一次迭代中,时间差timeMainCalculate-timeSubCalculate分别为timeMainEvaluate-timeSubEvaluate接近0,经过100次迭代后,两个步骤约为10秒,200步后时间差约为20.时间差为线性增加。子程序中计算和评估的持续时间是恒定的。因此,使用multiprocessing. Pool主程序和子程序之间的通信可能存在问题。

您的信息:我在八核计算机上使用Python 3.3。

opt_heuristic.py:

import multiprocessing.Pool
import datetime
import calculate, evaluate

epsilon = 1e-10
nbOfCpusForParallel = 6
nbCalculation = 6

def calculate_bound_update_information(result):
    Do_some_calculation using result
    return [bound,x,y,z]

if __name__ == '__main__':
    Inititalize x,y,z
    while bound > epsilon:

        # Calculate new Solution
        pool = multiprocessing.Pool(processes=nbOfCpusForParallel)
        result_parallel = list()
        for i in range(nbCalculation):
            result_parallel.append(pool.apply_async(calculate.main,[x,y,z]))
        timeMainCalculate = datetime.datetime.now() 
        pool.close()
        pool.join()
        resultCalculation = [result_parallel[i].get() for i in range(nbCalculation)]

        # Evaluate Solutions
        pool = multiprocessing.Pool(processes=nbOfCpusForParallel)
        argsEvalute = [[resultCalculation[i][0],resultCalculation[i][1]] for i in range(len(resultCalculation))]
        result_evaluate = list()
        for i in range(len(resultCalculation)):
            result_evaluate.append(pool.apply_async(evaluate.main,argsEvalute[i]))
        timeMainEvaluate = datetime.datetime.now()
        pool.close()
        pool.join()
        resultEvaluation = [result_evaluate[i].get() for i in range(len(resultCalculation))]
        [bound,x,y,z] = calculate_bound_update_information(resultEvaluation)

calculate.py:

import datetime
def main(x,y,z):
    timeSubCalculate = datetime.datetime.now() 
    Do some random calculation using x,y,z
    return result

evaluate.py

import datetime
def main(x,y):
    timeSubEvaluate = datetime.datetime.now() 
    Do some evaluation using x,y
    return result
在我看来,主程序存储了并行进程的一些信息。我尝试了一些删除池变量但没有成功的事情。

有人知道技术问题是什么以及如何解决?感谢。

0 个答案:

没有答案