python - 如何并行迭代 SimPy 模拟?
问题描述
我有一个 SimPy 模型,它返回一个我想多次复制的随机结果。每个复制都是独立的,因此为了使其更快,我想并行运行它们。我已经尝试过 Python 的multiprocessing、Pathos multiprocessing和 joblib Parallel,但每种方法都会出现相同的错误:TypeError: can't pickle generator objects
. 有没有办法避免这个错误并并行运行模拟?
SimPy 依赖于此处解释的生成器,因此无法避免使用它们。
解决方案
该错误很好地描述了问题。在您发送给子进程的对象中的某个地方,一个生成器潜伏着,大概在函数参数中。是否可以将此生成器转换为列表?
例如,以下引发了您提到的错误:
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]))
推荐阅读
- excel - Ruby Selenium send_keys_characters 没有发送我想要的字符串
- javascript - 努力从 Vanilla JavaScript 中的一对 API 中填充
- r - 使用包含 R 中列表的列对数据框进行反汇总
- c++ - Visual Studio Linux 找不到全局主机?
- c# - 客户端 Blazor Web 应用中的身份验证
- javascript - JSON.stringify(response.json()) 和 response.text() 之间的区别
- javascript - Vue Router Navigation Guard 动态导入
- google-sheets - 将多张工作表中的任务导入一张工作表
- concatenation - 为什么这是一个串联错误?只是想不通
- mysql - 优化 SQL 语句