MoonBit 异步网络库发布:落地智能体应用场景

B站影视 内地电影 2025-10-10 11:57 1

摘要:国产 MoonBit 编程语言宣布补齐关键特性的“最后一块拼图”—「 异步编程与网络库 」,标志其正式迈入可支撑 大规模云服务、高并发应用以及 AI Agent 平台的新阶段。

国产 MoonBit 编程语言宣布补齐关键特性的“最后一块拼图”—「 异步编程与网络库 」,标志其正式迈入可支撑 大规模云服务、高并发应用以及 AI Agent 平台的新阶段。

作为少数在语言初期即完成核心能力构建的编程语言。对比主流语言(C++26年、Python24年、Rust4.6年)的异步演进路径,这种后发优势使其直接采用现代结构化并发设计,使 MoonBit 避免历史包袱。

三大核心创新:

语法革命:首创无需await的异步调用机制,编译器自动推断调用方式(如@http.get自动触发异步),IDE通过斜体高亮实现视觉化区分

并发范式:基于任务树的自动取消机制,父任务失败时自动终止所有子任务,彻底解决传统异步编程中的孤儿任务问题

性能架构:单线程多任务模型+epoll/kqueue事件驱动,在200-1000并发连接测试中吞吐量超越Node.js/Go,延迟低至4.43ms

以下内容将结合「智能体开发的实际案例」,详细展示这一能力如何在实践中落地:

MoonBit 异步编程的优势

一、无需 await 的简洁语法

在 MoonBit 中,可以用 async 关键字声明异步函数,异步函数之间可以相互调用,并支持 async fn main 作为程序入口,以及 async test 来测试异步逻辑。

与许多语言不同,MoonBit 在调用异步函数时无需额外使用 await。编译器会根据类型自动推断调用方式,而 IDE 会以斜体高亮异步调用,让代码在保持简洁的同时仍具可读性。

因此,在 MoonBit 中进行异步编程几乎与同步编程一样自然:

async test { let (response, _) = @http.get("https://www.moonbitlang.cn") inspect(response.code, content="200") }

二、结构化并发设计

在异步编程中,任务之间的切换使控制流远比同步程序复杂,加之网络通信等场景常常伴随不可预期的错误,使得健壮的错误处理成为一项长期挑战。传统的非结构化模型将任务视为全局独立的实体,除非显式取消,否则会在后台持续运行。当一组并行任务中的某一分支出现异常时,其余分支若未被及时终止,就会形成孤儿任务(orphan task),长期占用资源,甚至影响系统稳定性。

MoonBit 的解决方案是 结构化并发。在这一模型下,任务呈现嵌套的树状结构:父任务的生命周期依赖于所有子任务,只有当子任务全部结束时父任务才会终止;若某一子任务失败,系统会自动取消其他子任务,并将错误逐级向上传递。这使得异步程序的错误处理在语义上更接近同步程序,既提升了可预测性,也大幅降低了开发复杂度。

下面的例子是 RFC 8305 中描述的 happy eyeball 【1】算法,它能很好演示结构化并发理念的优越性。一个网络域名可能对应多个 IP 地址,而 happy eyeball 就是一个自动的 IP 选择算法,它会依次尝试列表中的每个 IP,尝试发起连接。在每次连接尝试后,如果 250 毫秒内连接没有成功,就继续尝试下一个 IP。任何时候,只要有任何一个连接成功,就关闭其他连接,选择成功的那个连接。

MoonBit 中,happy eyeball 算法的实现如下:

pub async fn happy_eyeball(addrs : Array[@socket.Addr]) -> @socket.TCP { let mut result = None @async.with_task_group(fn(group) { for addr in addrs { group.spawn_bg(allow_failure=true, fn { let conn = @socket.TCP::connect(addr) result = Some(conn) group.return_immediately() }) @async.sleep(250) } }) match result { Some(conn) => conn None => fail("connection failure") } }

MoonBit 中的 happy eyeball 实现非常简洁,几乎就是对算法描述的直接翻译,但它能自动照顾到算法中的所有细节:作为对比,Python 的 asyncio 库中的 需要约 200 行代码,可读性也不如 MoonBit 版本。

三、性能对比

MoonBit 的异步运行时 moonbitlang/async 目前已支持 Linux 与 macOS 的 native 后端,底层基于线程池并结合 epoll/kqueue 实现。虽然仍处于早期阶段,这一运行时已经展现出出色的性能表现。

其设计思路与 Node.js 类似:采用 单线程、多任务模型。在这一模式下,异步程序中的同步部分始终在同一线程上执行。对开发者而言,这带来显著的简化效果——只要不涉及异步调用,程序的行为就与单线程应用一致,无需额外加锁,也不必担心竞争条件(race condition)等并发错误。

这种架构的代价是无法同时利用多个 CPU 核心进行计算。然而,异步程序往往以 I/O 密集型为主,计算开销相对有限。在这种场景下,即便只依赖单核,依然能够发挥出不俗的性能。这也意味着,MoonBit 在保证开发体验简洁性的同时,能够满足高并发 I/O 应用的性能需求。

为了检验 MoonBit 异步运行时的性能,我们搭建了一个简单的 TCP 服务器:它会把收到的数据原样返回给客户端。这个测试几乎没有计算成分,因此能够直接反映运行时在高并发场景下的处理能力。

在测试中,我们同时维持多个连接,不断收发数据,并记录吞吐量和响应延迟。结果显示,MoonBit 在并发连接数不断增加的情况下,依然保持了优异的吞吐表现和极低的响应延迟,充分体现了其运行时系统的高效性和稳定性。

对比的对象是 Node.js 和 Go 语言。性能测试的结果如下:

测试结果显示,MoonBit 在 200 到 1000 个并发连接下始终保持最高吞吐量,在高并发场景中明显优于 Node.js 和 Go。这表明其异步运行时具备出色的扩展性。

在高并发场景下,MoonBit 的平均延迟始终保持在个位数毫秒,即便在 1000 个连接时也只有 4.43ms;相比之下,Node.js 延迟超过 116ms。这意味着 MoonBit 的异步运行时能够在大规模连接下依然保持快速响应。

下面是一个 HTTP 服务器的例子。相比 TCP 服务器,HTTP 例子需要进行 HTTP 协议的解析,有更多的计算成分,不是单纯的 IO。得益于 MoonBit 语言本身的优秀性能,在这个测试中 MoonBit 依然表现良好。这个测试会使用 (github.com/wg/wrk) 工具,通过多个连接不断向 HTTP 服务器发送 GET / HTTP/1.1 的请求,服务器应当返回一个空的回复。测试会记录服务器每秒处理的请求数以及每个请求的平均延迟。测试的结果如下:

可以看到,MoonBit 在所有并发连接数下的请求处理效率和延迟都稳定高于 Node.js 和单线程的 Go。这里,Go 的 HTTP 服务器 net.http 可以使用多个 CPU 核心,为了和 MoonBit 及 Node.js 直接比较,测试时通过 GOMAXPROCS=1 限制了 Go 只使用一个 CPU 核心。上述两个测试中的代码都非常简单,因此 Node.js 测试中 javascript 代码的占比很小,更多反映的是它后端的 libuv,一个使用 C 编写的事件循环库的性能。

实例:使用 MoonBit 编写一个 AI agent

目前,MoonBit 的异步支持已经覆盖大部分基础应用,能够用于编写各种完整的异步程序。例如,下面是一个使用 MoonBit 编写的 AI agent 的例子。例子只包含核心的循环部分,完整的代码【2】:

let tools : Map[String, Tool] = { // 向 LLM 提供的工具列表 } async fn main { // 和 LLM 的对话历史 let conversation = // 发送给 LLM 的初始信息 let initial_message = User(content="Can you please tell me what time is it now?") for messages = [ initial_message ] { let request : Request = { model, messages: [..self.conversation, ..messages], tools: tools.values.collect, } // 把对话历史和新的消息一起发送给 LLM 并获取 LLM 的回复 let (response, response_body) = @http.post( "\{base_url}/chat/completions", request.to_json, headers={ "Authorization": "Bearer \{api_key}", "Content-Type": "application/json", "Connection": "close", }, ) guard response.code is (200..=299) else { fail("HTTP request failed: \{response.code} \{response.reason}") } let response : Response = @json.from_json(response_body.json) let response = response.choices[0].message guard response is Assistant(content~, tool_calls~) else { fail("Invalid response: \{response.to_json.stringify(indent=2)}") } // 把 LLM 的回复输出给用户 println("Assistant: \{content}") // 把这轮对话添加到对话历史里 conversation..push_iter(messages)..push(response) // 根据 LLM 的请求调用对应的工具 let new_messages = for tool_call in tool_calls { let message = handle_tool_call(tools, tool_call) new_messages.push(message) println("Tool: \{tool_call.function.name}") println(content) } continue new_messages } }

这个 AI agent 的例子看上去和普通的同步代码几乎没有区别,但其实这段代码是完全异步的。它可以模块化地和其他异步代码自由组合,例如监听用户输入、同时运行多个 agent 等等。当程序需要实现较为复杂的异步控制流时,MoonBit 的结构化并发设计也能极大地简化程序、提升程序的健壮性。因此,对于 AI agent 等典型异步应用,MoonBit 的异步编程系统不仅能够胜任,而且是非常合适的选择。

结尾

至此,MoonBit 已在语法稳定的基础上,正式提供了 异步支持,使开发者能够在 Web、原生、嵌入式等不同环境中保持一致的并发编程体验,极大简化了复杂系统的开发。这一特性不仅为高并发服务和分布式系统带来可靠支撑,也为 AI Agent 等新兴应用场景奠定了坚实基础。

对于开发者来说能够以更简洁的语法和结构化并发理念编写高效、安全的异步程序,能够构建高并发、低延迟的网络服务,更直接解锁了大量智能体相关的端到端应用场景。

对于行业而言,它打开了从对话代理到分布式服务、从实时数据处理到多智能体协作的全新可能;而对于投资者而言,则预示着 MoonBit 正在加速成长为 AI 时代的软件基础设施。

与此同时,MoonBit 生态正快速成长,已有 数十万用户加入实践,社区积累了 2000+ 个包,涵盖编译、测试、可视化、系统编程等多个领域。在语言特性、工具链与生态的合力推动下,MoonBit 正从一门编程语言稳步走向 面向 AI 时代的软件交付平台。

引用:

【1】happy eyeball 实现(https://github.com/aio-libs/aiohappyeyeballs/blob/main/src/aiohappyeyeballs/impl.py)

【2】代码实现 ( https://gist.github.com/tonyfettes/2953d5bef1610fce12cca05ea20655e2)

来源:做个梦给你1128

相关推荐