Параллельная обработка с ProcessPoolExecutor не работает без возврата ошибки - PullRequest
0 голосов
/ 23 января 2019

В настоящее время я пытаюсь ускорить моё моделирование. Я уже пробовал это с многопоточностью, и это работало. Теперь я хочу попробовать это с параллельными процессами, чтобы сравнить оба пути. Что я использую futures.ProcessPoolExecutor. Когда я запускаю свой скрипт, время симуляции печатается (очень мало), но моя программа не работает так, как должна. Обычно он должен генерировать несколько файлов, но они не генерируются. Кроме того, нет сообщения об ошибке. Я уже провел некоторые исследования в книгах и в Интернете, но не могу понять проблему.

Вот мой код:

def main(setting):
    cfg_path = generate(settings[setting])
    run_simulation(cfg_path)

if __name__ == '__main__':

    settings = get_wrapper_input_json("Szenarioanalyse.json")
    typ = "processes"
    start = time.perf_counter()
    if typ == "threads":
        with futures.ThreadPoolExecutor(cpu_count()-1) as e:
            e.map(main,settings)
    elif typ == "processes":
        with futures.ProcessPoolExecutor(cpu_count()-1) as e:
            e.map(main,settings)
    else:
        for setting in settings:
            main(setting)

    print("Simulationtime: "+str(time.perf_counter()-1))

1 Ответ

0 голосов
/ 23 января 2019

Я решил проблему:

settings = get_wrapper_input_json("Szenarioanalyse.json") #get the settings
parameters = {"Threads":True,"Processes":False,"Serial":False}

def simulate(setting):
    cfg_path = generate(settings[setting])
    run_simulation(cfg_path)


if __name__ == '__main__':

    for key,value in parameters.items():
        if key == "Threads" and value == True:
            start_threads = time.perf_counter()
            with futures.ThreadPoolExecutor(10) as e:
                e.map(simulate,settings)
            print("Simulationtime "+key+": "+str(time.perf_counter()-start_threads))
        elif key == "Processes" and value == True:
            start_processes = time.perf_counter()
            pool = multiprocessing.Pool(multiprocessing.cpu_count())
            pool.map(simulate,settings)
            print("Simulationtime "+key+": "+str(time.perf_counter()-start_processes))
        elif key == "Serial" and value == True:
            start_serial = time.perf_counter()
            for setting in settings:
                simulate(setting)
            print("Simulationtime "+key+": "+str(time.perf_counter()-start_serial))

        #save_dataframe("Szenarioanalyse.json")
        #file_management()
...