Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 非阻塞(事件驱动I/O)与阻塞I/O_Events_Node.js_Io_Blocking_Nonblocking - Fatal编程技术网

Events 非阻塞(事件驱动I/O)与阻塞I/O

Events 非阻塞(事件驱动I/O)与阻塞I/O,events,node.js,io,blocking,nonblocking,Events,Node.js,Io,Blocking,Nonblocking,最近,我偶然发现了一个非常灵活的JS库,名为nodeJS,它的行为类似于服务器端JS 语言的主要特性是事件I/O,它提供了I/O的固有能力,使用回调完全无阻塞 我的问题是,如果这种完全无阻塞的I/O机制在过去存在(鉴于事件驱动的I/O已经存在很长时间),为什么它们在C#和Java等高级语言中不更流行(尽管Java有支持无阻塞I/O的NIO实现) 目前,一个简单的文件读/写操作会导致完全的I/O阻塞,而事件驱动I/O的情况并非如此 我想更好地理解事件驱动I/O,以及它与Java的区别。Java甚至

最近,我偶然发现了一个非常灵活的JS库,名为nodeJS,它的行为类似于服务器端JS

语言的主要特性是事件I/O,它提供了I/O的固有能力,使用回调完全无阻塞

我的问题是,如果这种完全无阻塞的I/O机制在过去存在(鉴于事件驱动的I/O已经存在很长时间),为什么它们在C#和Java等高级语言中不更流行(尽管Java有支持无阻塞I/O的NIO实现)

目前,一个简单的文件读/写操作会导致完全的I/O阻塞,而事件驱动I/O的情况并非如此


我想更好地理解事件驱动I/O,以及它与Java的区别。

Java甚至对基本文件I/O的支持都很差。创建这些语言是为了快速创建便携式GUI应用程序,而不是为了优化和依赖操作系统的低级I/O操作。

Java:

用于写入可扩展服务器的多路复用、非阻塞I/O设备

.NET:


据我所知,人们普遍认为多线程比事件驱动更容易,因为在多线程编程中,每个线程都有一个简单的顺序执行流,而事件驱动由许多小的代码片段组成


当然,这一点在其他地方得到了更好的说明,请参见的示例Q.2。

Tcl从20世纪90年代就开始使用事件驱动I/O(如果我没有弄错的话)。当然是在2000年之前,因为在2000年的某个时候,当tclhttpd在基准测试中击败Apache时,人们才真正开始关注非阻塞I/O。当人们看到这一点时,他们开始重新编写web服务器。其早期成果之一是Lighttpd:第一个用C编写的非阻塞web服务器之一。当时,通过命令在tcl中使用事件驱动I/O已经被认为是tcl世界的标准实践

AOLserver曾经(现在仍然)有一个tcl核心,它托管着网络上最繁忙的站点之一(至少在早期是这样):。虽然服务器本身是用C编写的,但它使用tcl的C API来实现事件处理和I/O。AOLserver使用tcl的I/O子系统的原因是,它使用tcl作为脚本语言,开发人员认为既然其他人编写了它,那么也可以使用它

我相信AOLserver是在1995年首次发布的。这应该证实,早在20世纪90年代中期,tcl就已经提供了事件驱动I/O


Tcl是最早(如果不是的话)构建事件驱动引擎的语言之一。事件子系统最初是为Tk库实现的,后来被合并到tcl本身。

我很好奇为什么您认为Java/C没有异步IO?您是说使用Java NIO包??。我从来没用过,但我知道它很有能力。我将改变这个问题来解决这个问题。我不知道,这是一个笑话吗?这与事件I/O和批评Java I/O不可同日而语。是的,通过多线程的Java非阻塞I/O(虽然不是纯非阻塞I/O)与事件驱动I/O(纯非阻塞I/O)不同,但每个都有自己的优点和缺点。请举例支持你的说法。柯克好极了!!。但是你能解释更多关于新I/O的信息吗?它是事件驱动的吗??。我试着将它与nodeJS进行比较。nodeJS之所以如此受欢迎,是因为它是事件驱动的I/O。我不确定它是否是你所说的“事件”驱动的,但这是一个很好的教程:@A_Var:事件驱动引擎实际上只是状态机的抽象。在没有内置事件驱动引擎的语言中,大多数开发人员只是使用while循环和switch语句(或分派表)编写自己的状态机。有时,开发人员可能会费心去概括他们的状态机实现,从而从中生成API,从而生成语言的事件驱动库。Python的Twisted框架就是一个例子。
public IAsyncResult BeginReceive(
    byte[] buffer,
    int offset,
    int size,
    SocketFlags socketFlags,
    AsyncCallback callback,
    Object state
)