Python多处理增加时延的p

2024-04-18 12:15:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

供您参考:我在一台8核计算机上使用Python3.3。在

选择_启发式.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)

计算.py:

^{pr2}$

求值.py

import datetime
def main(x,y):
    timeSubEvaluate = datetime.datetime.now() 
    Do some evaluation using x,y
    return result

在我看来,主程序存储了一些并行进程的信息。我尝试过删除pool变量,但没有成功。在

有人知道什么是技术问题,如何解决?谢谢。在


Tags: inimportfordatetimerangeresultmultiprocessingpool