Node.js 异步I/O和异步函数之间的区别是什么?

Node.js 异步I/O和异步函数之间的区别是什么?,node.js,asynchronous,Node.js,Asynchronous,Node.js是一个异步I/O。这实际上意味着什么 通过生成另一个线程来创建异步函数是否有不同之处 e、 g 如果存在差异,我可以在javascript中执行异步I/O吗?异步I/O (摘自维基百科) 异步I/O或非阻塞I/O是输入/输出的一种形式 允许其他处理在 传输已完成 这意味着,如果进程希望在同步调用中执行read()或write(),则该进程必须等待硬件完成物理I/O,以便通知它I/O操作的成功/失败 在异步模式下,一旦进程异步发出读/写I/O,系统调用将在I/O传递到硬件或在OS/V

Node.js是一个异步I/O。这实际上意味着什么

通过生成另一个线程来创建异步函数是否有不同之处

e、 g

如果存在差异,我可以在javascript中执行异步I/O吗?

异步I/O (摘自维基百科)

异步I/O或非阻塞I/O是输入/输出的一种形式 允许其他处理在 传输已完成

这意味着,如果进程希望在同步调用中执行
read()
write()
,则该进程必须等待硬件完成物理I/O,以便通知它I/O操作的成功/失败

在异步模式下,一旦进程异步发出读/写I/O,系统调用将在I/O传递到硬件或在OS/VM中排队后立即返回。因此,进程的执行不会被阻塞(因此称为非阻塞I/O),因为它不需要等待来自系统调用的结果,它将在稍后接收结果

异步功能 异步函数是通过事件处理程序(或回调函数)将数据返回给调用方的函数。可以随时调用回调函数(取决于异步函数完成所需的时间)。这与同步函数不同,同步函数将在返回值之前执行其指令

…我可以用java进行异步I/O吗


是的,JavaNIO通过提供非阻塞I/O支持。另外,是一个网络框架,它还包括非阻塞I/O。与此相关的a回答了这个问题。

node.js使程序员能够通过强制使用回调来执行异步IO。现在回调类似于我们在javascript中使用了很长时间来处理DOM事件的旧异步函数! 例如 asyncIOReadFile(文件名、AsynfUncreadtheActualContent和DoSomething); log('我不知道文件中有什么') 函数asynforealContents和doSomething(文件内容){ log('现在我知道文件内容'+文件内容) } //通常,上述程序的输出如下 “我还不知道文件里有什么” //过了一段时间 '现在我知道文件内容是二进制的'
关于node.js中的异步代码,有几篇很棒的文章:


除了@Elite Gentle's answer,node不会为异步I/O函数生成线程。节点下的所有内容都在单线程事件循环中运行。这就是为什么除非绝对必要,否则避免某些I/O函数的同步版本非常重要,例如
fs.readSync


您可以阅读这篇优秀的博文以获得一些见解:

我正在研究相同的问题,因为这种异步IO模式对我来说是非常新的。我在infoq.com上找到了这个话题,这让我非常高兴。这家伙很好地解释了异步IO实际驻留的位置(操作系统->内核),以及如何将其嵌入node.js中,作为执行IO的主要习惯用法。享受吧

来自

同步阻塞I/O

一种简单的I/O方法是启动访问,然后等待它完成

将在通信过程中阻止程序的进程,使系统资源处于空闲状态

异步I/O

或者,可以启动通信,然后执行不需要完成I/O的处理

任何依赖于已完成的I/O的任务。。。仍然需要等待I/O操作完成,因此仍然被阻塞

但其他不依赖于I/O操作的处理可以继续

示例:


Node.js有一个事件驱动的体系结构能够进行异步I/O

@绅士:所以也可以通过异步I/O执行同步功能,不是吗?@Kit Ho,当然可以!只需在网上寻找非阻塞性的例子,这可能类似于让Kit在线查找心脏手术的例子并进行操作。知道它是一回事,当你不知道你在看什么的时候试图找到它是另一回事。你想用Java还是Javascript来做这件事?您提到了节点,所以我想您需要Javascript。。。也就是说,您确实意识到Java!==Javascript,对吗?基本上,我从node.js知道术语异步i/O,只是想知道异步IO和函数之间的区别。但是node.js只是异步i/O的最新流行实现。有什么特别的东西你不明白吗?函数是一段执行任务的代码,异步I/O是一种从磁盘获取数据而不阻塞的方法。@jcolebrand:我想我现在很清楚第一个链接已经死了。这是第一个链接的正确链接吗?这是第一个链接的正确链接吗?
void asyncfuntion(){
    Thread apple = new Thread(){
       public void run(){
           ...do stuff
       }
    }
    apple.start()
}
asyncIOReadFile(fileName, asynFuncReadTheActualContentsAndDoSomethingWithThem); console.log('IDontKnowWhatIsThereInTheFileYet') function asynFuncReadTheActualContentsAndDoSomethingWithThem(fileContents) { console.log('Now I know The File Contents' + fileContents) } //Generally the output of the above program will be following 'IDontKnowWhatIsThereInTheFileYet' //after quite a bit of time 'Now I know The File Contents somebinarystuff'