Параллельная обработка функции с разными аргументами - PullRequest
0 голосов
/ 05 июня 2019

Так что я просто хотел попробовать распараллеливание, чтобы ускорить мой сценарий, но все, что я нахожу в нем, на самом деле мне не помогает.

У меня работает алгоритм оптимизации, и в каждой итерации требуется несколько оценок различных параметров. Каждая из этих оценок представляет собой симуляцию, которая занимает около 10 минут.

while(True):
    f_xn = runSim(xn[0],xn[1],25,na)
    f_xb = runSim(xb[0],xb[1],25,na)
    if f_xn < e:
        break

Так есть ли способ заставить эти два вызова функций выполняться одновременно, а затем позволить процессу продолжить со значениями f_xn и f_xb, как только они оба будут завершены?

Определение runSim (). Некоторые строки здесь отсутствуют, но они просто меняют некоторые значения в текстовом файле.

def runSim(n):
    if 'SUMO_HOME' in os.environ:
        tools = os.path.join(os.environ['SUMO_HOME'], 'tools')
        sys.path.append(tools)
    else:   
         sys.exit("please declare environment variable 'SUMO_HOME'")

    sumoBinary = "C:\Program Files (x86)/DLR/Sumo/bin/sumo-gui.exe"
    sumoCmd = [sumoBinary, "-c", "sim/sumo_config.sumo.cfg"]

    speed_error = []
    ntg_error = []

    for i in range(0,n):
        print(i)
        sumoBinary = "C:\Program Files (x86)/DLR/Sumo/bin/sumo.exe"
        sumoCmd = [sumoBinary, "-c", "sim/sumo_config.sumo.cfg"]
        traci.start(sumoCmd) 
        while traci.simulation.getMinExpectedNumber() > 0:
           traci.simulationStep()
           setVehType()

        traci.close()
        speed, ntg = Auswertung.auswerten()
        speed_error.append(speed)
        ntg_error.append(ntg)

    speed_mean_error = sum(speed_error)/len(speed_error)
    ntg_mean_error = sum(ntg_error)/len(ntg_error)    
    return speed_mean_error, ntg_mean_error

1 Ответ

0 голосов
/ 06 июня 2019

После этой документации следующий код будет делать:

from multiprocessing import Pool

pool = Pool(processes=2)              # start worker processes

while True:
    # launching multiple evaluations asynchronously
    p1 = pool.apply_async(runSim, (xn[0],xn[1],25,na))
    p2 = pool.apply_async(runSim, (xb[0],xb[1],25,na))
    f_xn = p1.get()
    f_xb = p2.get()
    if f_xn < e:
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...