ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Monty异步编程完全指南:async宿主函数、await与asyncio.gather并发执行

Monty异步编程完全指南:async宿主函数、await与asyncio.gather并发执行 Monty异步编程完全指南async宿主函数、await与asyncio.gather并发执行【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/montyMonty 是一个用 Rust 编写的极简、安全 Python 解释器专为 AI 生成代码而设计。它的异步编程模型让沙箱代码可以安全地并发调用宿主函数通过AsyncMonty、await与asyncio.gather你可以把网络请求、数据库查询等耗时操作放到宿主机上并行执行而不需要容器或线程。为什么 Monty 需要异步模型传统沙箱靠容器隔离启动慢、资源重。Monty 走的是另一条路沙箱不直接碰外部世界任何外部交互都必须通过开发者显式提供的宿主函数Host Function完成。对于耗时较长的操作比如fetch一个网页同步阻塞会白白占用整个执行流。Monty 的解法是沙箱内部的async def/await语法与 Python 一致沙箱里没有事件循环宿主就是事件循环the host is the loopasyncio.gather让多个宿主调用真正并发运行这个设计保证了既拿到并发性能又保持零信任隔离。快速上手AsyncMonty 异步宿主函数只需三步使用AsyncMonty代替同步的Monty在external_lookup中传入协程函数async def定义的宿主函数沙箱代码用await或gather调用它们from pydantic_monty import AsyncMonty async def fetch(url: str) - str: return fcontents of {url} code await fetch(https://example.com) async with AsyncMonty() as pool: async with pool.checkout() as session: result await session.feed_run(code, external_lookup{fetch: fetch})⚠️ 注意同步版Monty不能驱动协程宿主函数必须用AsyncMonty或改用快照机制手动驱动挂起。更完整的入门示例见 docs/quickstart/python.md。asyncio.gather让多个宿主调用真正并发asyncio.gather是沙箱内的并发核心。它接收多个可等待对象同时发起宿主调用并返回结果列表顺序与参数一致而非完成顺序。import asyncio results await asyncio.gather(fetch(a), fetch(b))几个关键行为场景Monty 的行为多个宿主调用全部并发执行结果按参数顺序返回空参数gather()返回[]传入非可等待对象抛TypeError支持*args解包✅ 列表、元组均可同一协程/future 传入两次自动去重函数体只执行一次已完成/失败的 gather 再次 await返回缓存结果或重复抛出缓存异常gather的实现细节任务状态机、结果槽位、去重逻辑可以在 crates/monty/src/asyncio.rs 中看到行为验证用例在 crates/monty/test_cases/async__gather_all.py。并发模型协作者式调度没有抢占理解 Monty 异步的关键一句话并发是协作式、宿主驱动的。gather会在所有分支都阻塞在外部调用时把挂起的调用交给宿主宿主返回结果后沙箱再恢复执行没有抢占、没有线程、沙箱内没有调度器这意味着两点实际影响协程是一次性的single-shot同一个协程对象 await 第二次会抛RuntimeError。需要复用结果时请保存结果而不是协程本身。宿主回调内部若写了阻塞代码会阻塞你自己的事件循环——AsyncMonty移离事件循环的是 worker I/O而不是你的回调。asyncio 模块的边界只有 run 和 gather沙箱里的asyncio模块刻意做得很小只暴露两个函数asyncio.run(coro)—— 运行协程直到结束asyncio.gather(*awaitables)—— 并发执行并收集结果不支持任何关键字参数create_task、sleep、wait、Queue、Lock等均未实现访问会抛AttributeErrorasync for、async with和异步推导式则在解析期直接拒绝。完整的差异清单见 limitations/asyncio.md。另外两个值得知道的与 CPython 的差异未 await 的 gather 不会启动子任务asyncio.gather(boom())若丢弃结果Monty 里什么代码都不会执行失败的 gather 的兄弟任务推进受限它们只会在宿主结果到达或其他任务挂起时恢复因此某些边界场景的输出顺序与 CPython 不同进阶手动驱动挂起快照如果不想让feed_run自动应答所有挂起可以用feed_start拿到每一个挂起点快照记录、限流、审批甚至序列化到数据库明天再恢复snapshot session.feed_start(fetch(url), inputs{url: https://example.com}) result snapshot.resume({return_value: page contents})当沙箱内所有任务都阻塞在宿主 future 上时会得到FutureSnapshot可按call_id批量提交结果。详见 docs/snapshots.md。相关文件速查内容路径宿主函数完整指南docs/host-functions.mdasyncio 限制与差异limitations/asyncio.md核心异步类型协程/Future/Gathercrates/monty/src/asyncio.rs基础 await 用例crates/monty/test_cases/async__basic.pygather 并发用例crates/monty/test_cases/async__gather_all.py异步宿主调用用例crates/monty/test_cases/async__ext_call.pyPython 快速上手docs/quickstart/python.md小结Monty 的异步编程为「AI 写代码、宿主供工具」的场景提供了轻量又安全的并发方案用AsyncMonty开启异步池宿主函数写成async def沙箱内用await单点调用用asyncio.gather批量并发记住沙箱无事件循环——宿主即循环并发性能取决于你的宿主实现需要暂停/恢复/审计时用快照机制接管每一次挂起掌握这四点你就能在微秒级启动的沙箱里安全地跑起 AI 生成的并发 Python 代码了。【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/monty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表