最近我偶然发现了这个名为nodeJS的漂亮JS库,它就像服务器端JS一样。
该语言的主要特性是Evented I / O,它使I / O的固有容量完全无阻塞,使用回调!
我的问题是,如果过去存在这种完全无阻塞的I / O机制(给定事件驱动的I / O已经存在了很长时间),为什么它们在高级语言中不再流行像C#和Java(虽然Java有NIO实现支持非阻塞I / O)?
目前,简单的文件读/写操作会导致完整的I / O阻塞,而事件驱动的I / O则不然。
我希望更好地了解事件驱动的I / O以及它与Java中的不同。
答案 0 :(得分:5)
Java:http://en.wikipedia.org/wiki/New_I/O
用于编写可伸缩服务器的多路复用,非阻塞I / O工具
.NET:http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx
public IAsyncResult BeginReceive(
byte[] buffer,
int offset,
int size,
SocketFlags socketFlags,
AsyncCallback callback,
Object state
)
答案 1 :(得分:3)
Tcl从1990年开始就有事件驱动的I / O(如果我没弄错的话)。当然在2000年之前,因为当tclhttpd在2000年某个时候在基准测试中击败Apache时,人们真的开始关注非阻塞I / O.当人们看到这一点时,他们开始重新编写Web服务器。其中一个早期结果是Lighttpd:用C语言编写的第一个非阻塞Web服务器之一。当时,通过fileevent命令在tcl中使用事件驱动的I / O已经被认为是标准做法tcl世界。
AOLserver已经(现在仍然)有一个tcl核心,它正在托管网络上最繁忙的网站之一(至少在早期):http://www.aol.com/。虽然服务器本身是用C语言编写的,但它使用tcl的C API来实现事件处理和I / O. AOLserver使用tcl的I / O子系统的原因是因为它使用tcl作为脚本语言而且开发人员认为,既然其他人已经编写了它,那么也可以使用它。
我相信AOLserver最初于1995年发布。这应该证实,事件驱动的I / O早在20世纪90年代中期就已经在tcl中出现了。
Tcl是最早的一种,如果不是 最早的语言,它有一个事件驱动引擎。事件子系统最初是为Tk库实现的,后来又合并到了tcl中。
答案 2 :(得分:1)
据我了解,有一种广泛的感知多线程比事件驱动更容易,因为在多线程编程中,每个线程都有一个简单的顺序执行流程,而事件驱动包含大量的代码的小片段。
当然,这在其他地方有更好的说明,例如参见state-threads FAQ的Q.2。
答案 3 :(得分:-4)
即使对于基本文件I / O,Java也支持不良。这些语言是为快速创建可移植GUI应用程序而创建的,而不是针对优化和操作系统相关的低级I / O操作而创建的。