拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Monty 快照完全指南:如何把整个 Python 解释器序列化成字节

Monty 快照完全指南如何把整个 Python 解释器序列化成字节【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/montyMonty 快照Snapshot是 Monty 解释器的招牌能力把整个 Python 解释器序列化成一段字节之后随时在另一个进程、甚至另一台机器上恢复并继续执行。Monty 是一个用 Rust 编写的极简、安全 Python 解释器专为运行 AI 生成的代码而设计快照功能让它成为构建长任务 AI Agent 的理想沙箱。为什么解释器可以被暂停并保存⏸️大多数运行时如 CPython无法做到这一点因为它们持有大量操作系统资源打开的文件描述符、连接的 socket、正在跑的线程。一旦进程退出这些东西就死了。Monty 的沙箱不持有任何 OS 资源——没有活动文件句柄、没有套接字、没有线程需要重建。当执行被挂起时所有重要的东西都只存在于解释器自己的堆heap里堆里的所有对象 字节码 VM 的栈和调用帧 执行器状态 一个可以完整序列化的纯数据世界这就是快照能工作的根本原因整个解释器的状态都是纯数据自然可以存成字节。两种可以生成的快照字节 Monty 提供两种 dump都是不透明的字节串blob类型生成时机恢复方式包含内容会话存档Session dump两次 feed 之间无代码在跑load_session全局变量、函数、类、时间预算快照Snapshotfeed 中途暂停点处load_snapshot以上全部 被暂停的调用栈⚠️ 注意加载器不能混用——用load_session恢复一个暂停快照或反过来会直接报错且两者都只能在全新会话、尚未 feed 任何代码时调用。快速上手三步完成暂停、保存、恢复下面是一段 Python 代码pydantic-monty包演示完整流程——沙箱执行fetch(url)时暂停把暂停状态存成字节稍后恢复并注入结果from pydantic_monty import FunctionSnapshot, Monty, MontyComplete with Monty() as pool: with pool.checkout() as session: # ① 用 feed_start 启动遇到外部函数调用就暂停并返回快照 snapshot session.feed_start(fetch(url), inputs{url: https://example.com}) blob snapshot.dump() # ② 序列化整个暂停的 worker # 之后——甚至几天后、在另一台机器上 with pool.checkout() as session: snapshot session.load_snapshot(blob) # ③ 恢复到全新会话 result snapshot.resume({return_value: page contents}) print(result.output) # page contents关键 API 只有四个feed_start(...)—— 可暂停版执行器遇到挂起点就把控制权交还给你snapshot.dump()—— 把暂停的解释器序列化成字节session.load_snapshot(blob)—— 在全新会话中恢复snapshot.resume(...)—— 注入结果继续执行每个快照最多恢复一次四种暂停点解释器为什么停下来feed_start驱动的每一步可能返回四种进度之一对应解释器停止的原因快照类型停止原因如何恢复FunctionSnapshot调用了宿主函数或 OS 操作resume(result)/resume_auto()NameLookupSnapshot读到了一个未定义的名字resume(value...)或不传值让其自然抛NameErrorFutureSnapshot所有沙箱任务都阻塞在宿主 future 上resume({call_id: result})MontyComplete没什么原因——代码跑完了直接读.output如果不想手动逐个应答挂起可以传入external_lookup宿主函数表后循环调用resume_auto()它会像普通feed_run一样自动解决每次挂起但每走一步都能停下来检查或dump()——调试利器。快照字节里到底装了什么字节结构非常讲究核心实现在 dump_format.rs[MAGIC: MONTY\0] [版本号 u16] [postcard 编码的负载]魔术头MONTY\0 版本号当前为 6让加载器一眼识别这是不是 Monty 的存档、版本对不对负载用 postcard 二进制编码紧凑且无标签开销负载本身是三样东西的组合见 dump_format.rs脚本名用于 traceback、类型检查状态、解释器状态解释器状态有三种形态dump_format.rsIdle两次 feed 之间、SuspendedREPL 中途暂停、Running一次性执行中途暂停。版本锁定是硬约束不同 Monty 版本生成的字节互相拒收宁可拒绝也不解码出错误邻居状态所以请把快照当作只在同一版本内有效的工件。源码里甚至专门有测试确保字节码操作码等组件一变就必须升级版本号dump_format.rs。⚠️ 重要哪些内容会随行哪些不会这是最容易踩坑的部分内容是否随行会话配置script_name、资源限制、类型检查状态✅ 随 dump 走而非来自恢复时的checkout()已累计的时间预算✅ 随行——恢复后接着算不会满血复活文件挂载mount❌不随行——宿主路径绝不进入 dump恢复时需重新传入否则文件系统调用退化为未处理的 OS 调用dump 前 overlay 里的写入❌ 消失——恢复后的 overlay 是空的恢复出的FutureSnapshot⚠️ 不能用resume_auto()驱动挂起的协程活在旧进程里只能手动resume({call_id: ...})四大实战场景 Monty 官方文档docs/snapshots.md列出了快照的四类经典用途长任务 Agent—— 在工具调用处暂停把字节存进数据库等工具返回时再恢复哪怕发生在不同的主机上审批闸门—— 在敏感操作处暂停存下快照等人类批准后恢复执行分支探索Forking—— 把一份快照恢复到多个会话从同一状态并行探索多条分支跨越重启—— 远程服务器部署排空时交出一个 dump你在别处恢复继续跑多语言 API 速览语言暂停序列化恢复Pythonsession.feed_start(...)snapshot.dump()/session.dump()session.load_snapshot(blob)/session.load_session(blob)JavaScriptsession.feedStart(...)await snapshot.dump()session.loadSnapshot(blob)/session.loadSession(blob)RustMontyRun::start(...)自由函数monty::dump进程内/Checkout::dump池模式Dump::load(bytes)/Checkout::restoreRust 端的示例与说明见 docs/quickstart/rust.mdSerialization 一节JavaScript 端测试用例可参考 feed_start.spec.tsPython 绑定文档见 pydantic-monty/README.md。延伸阅读 快照官方文档docs/snapshots.md挂起点类型定义run_progress.rs堆内存模型快照的物质基础heap/mod.rs资源限制时间预算如何随行docs/resource-limits.md安全模型docs/security.md 一句话总结Monty 快照 把 AI Agent 正在执行的 Python 程序存档成字节随时读档继续——这正是构建可中断、可迁移、可审批的 AI 代码执行基础设施的关键能力。【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/monty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门