There exist SimPy based models where simulation runtime can be on the order of many hours, simulating many millions of events. I work on one such model.
Being able to serialize/deserialize the state of a simulation would be an enormously useful feature. A couple examples:
1. Ability to stop/serialize and then later deserialize/resume a simulation would enable long-runtime simulations to be run on lowest-cost cloud compute resources (EC2 Spot Instances, Preemptable VMs on GCP, etc). I.e. by resuming your in-progress simulation later on a different node after the node the simulation started on is preempted.
2. Create periodic save points in long running simulations to reduce the time needed to reproduce an interesting simulation dynamic or bug.
3. Resume and extend the duration of a simulation that is producing interesting data and/or exhibiting interesting phenomenon.
If we could figure out a way to do this with SimPy, that would be amazing. That said, one of the key obstacles to doing this with snowpy is that Python generators are not pickle-able[1]. I'm sure there would be other challenges to pickling SimPy's state, not to mention appropriately capturing application-specific state.
Regarding seeds, I agree with Joe that managing the PRNG seed of a simulation is a good technique. It's both useful for the stated purpose of having deterministic simulations and for being able to run multiple differently-seeded simulations (often in parallel) to help measure variability of the system being modeled. This second technique can sometimes help avoid some of the problems with very long runtime simulations by replacing with several shorter runtime simulations.
Pete