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

Exporting data from an objected oriented SimPy model that is run with parallel processing

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

之外创建一次

为了减少 运行 多个 运行 时的计算时间,我想从使用多个 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 仍然是空的,因为其中没有存储任何内容。在没有并行处理的情况下执行多个 运行s 并将每个 运行 的数据存储在 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)