复制包含SimPy进程的类实例的最简单方法是什么?

问题描述 投票:1回答:1

我正在尝试创建一个可以模拟的类实例的副本,而不会影响该类的原始实例。我尝试使用copy.copy,但是遇到了这个问题:

system.simulate(until=100)

print(system.env.now) # prints 100

copy_of_system = copy.copy(system)
copy_of_system.simulate(until=200)

print(copy_of_system.env.now) # prints 200
print(system.env.now) # prints 200, but should print 100

[使用copy.deepcopy时,我会得到TypeError: can't pickle generator objects。有没有有效的方法来创建system对象的独立副本?

python deep-copy simpy
1个回答
0
投票

我对这个话题也很感兴趣。毕竟,在经过漫长而昂贵的第一部分之后,模拟中的分叉场景将具有巨大的价值。目前,我们必须重新运行所有内容。我试图在过去的几天中找到解决方案,但到目前为止没有成功。

与发电机相关的错误的解释在这里:Why can't generators be pickled?

一种可能的解决方案可能是使用pypy解释器,因为如此处所述,它提供了能够使生成器腌制的类似无栈的功能。

我首先尝试使用pypy3.6,因为我的程序是用Python3编写的,但是失败了。使用dill没有帮助。我在这里找到了解释:https://bitbucket.org/pypy/pypy/issues/3150/can-pickle-generators-in-27-but-not-on-36

假设这是唯一的障碍,在Python2中翻译程序将使simpy.Environment中的整个pypy腌制。

[如果有人尝试,请分享您的结果;我会告诉你我的最新消息。

编辑:即使它可以腌制发生器,我也无法使其与pypy一起使用。 pickle不序列化。 dill进行序列化,但是在加载序列化的字符串时遇到一些AttributeError错误。我不知道这种情况是否会在任何环境下发生,还是仅在我的复杂环境下发生?我需要原样。如果有时间,我将尝试序列化更简单的环境。如果有人设法腌制一个完整的环境,请告诉我们。

© www.soinside.com 2019 - 2024. All rights reserved.