Python 有无某种实现 Checkpoint / Snapshot 的包?

2022-05-09 15:43:54 +08:00
 CatCode

需求:一个步骤非常多,执行时间很长的脚本。在其中某些时刻,可以创建一个检查点文件,把当前状态(变量、执行上下文之类的)给保存下来。如果当前进程在某个时刻因为某些原因被 kill 了,可以从之前保存的检查点处继续(除了系统时间、进程号之类的变了,其他的都一样)。就像游戏里面的手动存档机制一样。

类似于:

a = do_something()
checkpoint.save("ck01.bin")
b = do_other_thing1(a)
do_other_thing2(a, b)

例如正在执行do_other_thing2(a, b)的时候被 kill 了,可以恢复从ck01.bin文件里面恢复

checkpoint.load("ck01.bin")
checkpoint.continue()

就会从b = do_other_thing1(a)处开始重新执行。

不知道 V 友们有没有见过比较成熟的实现类似功能的包,或者需要参考哪些方面的内容。 (很久之前我自己是糊了一个,但是用起来限制太大。所有要保存的参数必须放到一个字典里面,并且各种手动传递,非常蛋疼)

2876 次点击
所在节点    Python
22 条回复
CatCode
2022-05-10 10:47:41 +08:00
@ch2 我说过我并非想处理每一种情况。我已经注明了不考虑多线程 /多进程——意味着我创建检查点的时候只有一个线程和进程。17 楼里我也说了检查点的创建是在没有 TCP 链接、所有打开的文件已经关闭的情况。我的任务也不依赖于 PID 号,所以变了也无所谓。17 楼真的说的很明白了,是一段一段地处理大量操作。如果还不明白,找个类比,GitHub Actions 里面的 steps 。
gengchun
2022-05-10 11:25:34 +08:00
前段时间有个类似的需求,我是每步直接缓存结果,类似于 http GET 缓存的处理方式,通过一个标志符和一个上下文 hashmap 做键值。每步就检查有没有缓存,有就直接返回缓存结果,没有就算一次。

检查缓存的逻辑本身,当然可以用装饰器语法加上。不需要考虑多子任务,并发结果合并什么的,感觉用不到什么高级的库。

只是想开拓一下思路。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851762

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX