首页 > 解决方案 > 如何并行迭代 SimPy 模拟?

问题描述

我有一个 SimPy 模型,它返回一个我想多次复制的随机结果。每个复制都是独立的,因此为了使其更快,我想并行运行它们。我已经尝试过 Python 的multiprocessingPathos multiprocessing和 joblib Parallel,但每种方法都会出现相同的错误:TypeError: can't pickle generator objects. 有没有办法避免这个错误并并行运行模拟?

SimPy 依赖于此处解释的生成器,因此无法避免使用它们。

标签: pythonparallel-processingsimpy

解决方案


该错误很好地描述了问题。在您发送给子进程的对象中的某个地方,一个生成器潜伏着,大概在函数参数中。是否可以将此生成器转换为列表?

例如,以下引发了您提到的错误:

from multiprocessing import Pool

def firstn(n):
    k = 0
    while k < n:
        yield k
        k += 1

if __name__ == "__main__":
    p = Pool(2)
    print(p.map(firstn, [1, 2, 3, 4]))

但这一个有效:

from multiprocessing import Pool

def firstn(n):
    k = 0
    while k < n:
        yield k
        k += 1

def wrapped(n):
    return list(firstn(n))

if __name__ == "__main__":
    p = Pool(2)
    print(p.map(wrapped, [1, 2, 3, 4]))

推荐阅读