cristiklein / simpy

MIT License
107 stars 16 forks source link

how to serialize env object( like pickle.dump())? #17

Closed xuqinghan closed 3 years ago

xuqinghan commented 3 years ago

It's there anyway to save/load an env object to harddisk?

demo code as:

import simpy
import pickle

def car(env):
    while True:
        print('Start parking at %d' % env.now)
        parking_duration = 5
        yield env.timeout(parking_duration)
        print('Start driving at %d' % env.now)
        trip_duration = 2
        yield env.timeout(trip_duration)

if __name__ == '__main__':
    env = simpy.Environment()
    env.process(car(env))
    env.run(until=15)
    print('env pause')
    with open('game_save.pkl', 'wb') as f:
        pickle.dump(env, f)
    print('env save')
    #'env load'
    print('env rusume')
    env.run(until=30)

I see as simpy based on python's generator which is cant pickle (Why can't generators be pickled?) while generator seems can be dumped under pypy.

so I turn to pypy, but still cant dump “env“ object.

error info is that:

PS D:\tests> pypy3 test_dump.py Start parking at 0 Start driving at 5 Start parking at 7 Start driving at 12 Start parking at 14 env pause Traceback (most recent call last): File "test_dump.py", line 20, in pickle.dump(env, f) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 1598, in _dump _Pickler(file, protocol, fix_imports=fix_imports).dump(obj) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 450, in dump self.save(obj) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 562, in save self.save_reduce(obj=obj, rv) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 675, in save_reduce save(state) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 517, in save f(self, obj) # Call unbound method with explicit self File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 872, in save_dict self._batch_setitems(obj.items()) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 898, in _batch_setitems save(v) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 517, in save f(self, obj) # Call unbound method with explicit self File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 832, in save_list self._batch_appends(obj) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 859, in _batch_appends save(tmp[0]) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 517, in save f(self, obj) # Call unbound method with explicit self File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 802, in save_tuple save(element) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 562, in save self.save_reduce(obj=obj, rv) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 675, in save_reduce save(state) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 517, in save f(self, obj) # Call unbound method with explicit self File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 872, in save_dict self._batch_setitems(obj.items()) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 898, in _batch_setitems save(v) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 517, in save f(self, obj) # Call unbound method with explicit self File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 832, in save_list self._batch_appends(obj) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 859, in _batch_appends save(tmp[0]) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 562, in save self.save_reduce(obj=obj, rv) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 651, in save_reduce save(args) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 517, in save f(self, obj) # Call unbound method with explicit self File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 787, in save_tuple save(element) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 562, in save self.save_reduce(obj=obj, rv) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 675, in save_reduce save(state) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 517, in save f(self, obj) # Call unbound method with explicit self File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 872, in save_dict self._batch_setitems(obj.items()) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 898, in _batch_setitems save(v) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 562, in save self.save_reduce(obj=obj, *rv) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 646, in save_reduce save(cls) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 517, in save f(self, obj) # Call unbound method with explicit self File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 1029, in save_type return self.save_global(obj) File "D:\soft\dev\python\pypy3.7-v7.3.5-win64\lib-python\3\pickle.py", line 973, in save_global (obj, module_name, name)) from None pickle.PicklingError: Can't pickle <class 'generator'>: it's not found as builtins.generator

cristiklein commented 3 years ago

Hi,

Please note that simpy has moved here: https://gitlab.com/team-simpy/simpy/. I suggest you re-issue your question there, to access a wider community.

To your original question, I don't think that pickling the Environment is currently a SimPy feature. I suggest you implement __getstate__ and __setstate__ for Environment. If you feel this is of general interest consider contributing your code upstream.