从并行处理运行的面向对象的 SimPy 模型导出数据

问题描述

我使用面向对象的原则在 SimPy 中创建了一个仿真模型。主要逻辑包含在 Model 类中。其中,它包含一个实体生成函数,该函数生成实体以流经模型。在运行时,输出使用列表 Model.save_data() 中的 output_list 保存,该列表在任何类之外创建一次。

为了在我多次运行时减少计算时间,我想从使用多个 cpu 内核中受益。 要在不使用并行处理的情况下执行我的模型,我使用以下代码

for run in range(g.number_of_runs):
    print(f"Run {run + 1}")
    my_model = Model(run)
    my_model.run()

我尝试使用 joblib 库以并行方式执行我的 for 循环。我首先写了一个包装函数

import time
from joblib import Parallel,delayed

def wrapper(run):
    print(f"Run {run + 1}")
    my_model = Model(run)
    my_model.run()

results = Parallel(n_jobs=16)(delayed(wrapper)(run) for run in range(g.number_of_runs))

代码执行没有错误。该模型似乎在我输入 print() 语句进行检查时运行。但是,output_list 保持为空,因为其中没有存储任何内容。在没有并行处理的情况下执行多次运行并将每次运行的数据存储在 output_list 中按预期工作。我在这里错过了什么?

解决方法

以下 SO 答案帮我弄明白了:How to append items to a list in a parallel process (python)?

使用以下代码,我可以并行执行我的 SimPy 模型并将每次运行的数据保存到列表中:

if (__name__ == '__main__'):
    output_list = mp.Manager().list()
    results = Parallel(n_jobs=16)(delayed(wrapper)(run) for run in range(g.number_of_runs))

    # Convert the Manager().list() list to a regular list
    output_list_pure = list(output_list)