事件驱动/异步语言列表

12 投票
4 回答
4420 浏览
提问于 2025-04-15 20:02

我正在开发一个系统,要求从一开始就具备很好的扩展性。我开始尝试使用异步或事件驱动的方式来编写服务器端代码。我试过了 Ruby 的 EventMachine 和 Node.js。

EventMachine 很不错,但它不支持异步文件输入输出,而我正好需要这个功能。而且它的接口也有点奇怪。

Node.js 非常棒,但...呃...它是 JavaScript。

有没有人能帮我列出其他支持强大异步功能的编程语言?要符合条件,这种语言需要支持闭包,并且有异步文件输入输出、HTTP 等相关的库。如果能找到像 Node.js 这样,但用比 JavaScript 更强的语言写的就更好了。

Lisp 呢?Python 有 Twisted,对吧?

4 个回答

4

F# 语言有一种叫做异步工作流的东西,这是一种非常棒的写异步代码的方法。

16

我建议你再看看node.js。在面向对象的编程语言中使用库来进行基于事件的编程,最大的一个问题就是,通常其他现有的库并不是基于事件的,这样混合使用基于事件的和同步输入输出(I/O)就会很尴尬。实际上,这几乎是不可能的,或者更准确地说,是可能的,但会破坏使用基于事件的I/O的所有好处。(要注意,几乎你使用的任何第三方库(以及它们使用的库等等),包括语言本身的标准库和核心库,都必须是基于事件的,才能真正享受到这些好处。否则,你会花费项目大部分时间在现有库周围写异步的包装代码。)

那么,如果使用基于事件的库这么糟糕,为什么我还推荐node.js呢?很简单:ECMAScript没有任何同步I/O库(因为它根本没有任何I/O库),所以混合使用的问题根本不存在。(实际上,它有一些I/O库,比如XmlHttpRequest或Web Sockets,但你猜怎么着:那些库已经都是基于事件的。)

node.js自己实现了所有的I/O库,都是基于事件的,没有向后兼容或遗留要求。

否则,几乎每种语言或平台都有一些基于事件或异步的I/O库:Ruby有EventMachineRev,.NET有Rx,JVM有NIO,Unix系统有kqueue/epoll,C语言有libevlibeio(node.js和Rev就是建立在这些库之上的),Perl有AnyEvent(也是基于libev的同一作者开发的),等等。

20

Erlang 可能是服务器端代码中最具扩展性的编程语言。它能帮你处理多任务,主要是通过异步和协作的方式在后台进行任务切换。如果你能接受它那奇特的语法和有时让人困惑的语义,那就可以尝试。

Python 有几个库可以用来处理网络任务,比如 twisted(适用于各种网络任务)、tornado(专门用于服务器端的异步处理)和 stackless(在多人在线游戏中广泛使用)。还有一个老旧但仍然可用的 asyncore,它在标准库中可以找到,甚至还有更老的 "Medusa",它是在 asyncore 的基础上增加了更多功能。

Go 语言提供了非常轻量级的 "无栈" goroutineschannels,可以在需要时用于同步。

撰写回答