Node.js是一个异步I / O.这究竟意味着什么?
我通过生成另一个线程来创建异步函数来进行这个过程有什么不同吗?
e.g。
void asyncfuntion(){
Thread apple = new Thread(){
public void run(){
...do stuff
}
}
apple.start()
}
如果有差异,我可以在javascript中进行异步I / O吗?
答案 0 :(得分:13)
Asynchronous I/O(来自维基百科)
异步I / O或非阻塞I / O是一种输入/输出形式 允许其他处理在此之前继续的处理 传输已经完成。
这意味着,如果进程想要在同步调用中执行read()
或write()
,则该进程必须等到硬件完成物理I / O以便它可以告知I / O操作的成功/失败。
在异步模式下,一旦进程异步发出读/写I / O,一旦I / O传递到硬件或在OS / VM中排队,就会立即返回系统调用。因此,不阻止进程的执行(因此它被称为非阻塞I / O),因为它不需要等待系统调用的结果,它将在稍后接收结果。
异步函数是一种通过事件处理程序(或回调函数)将数据返回给调用者的函数。可以随时调用回调函数(取决于异步函数完成所需的时间)。这与同步函数不同,后者将在返回值之前执行其指令。
...我可以在java中进行异步I / O吗?
是的,Java NIO通过Selector提供非阻塞I / O支持。此外,Apache MINA是一个网络框架,还包括非阻塞I / O.问题的相关SO question答案。
答案 1 :(得分:4)
在node.js中有几篇关于异步代码的精彩文章:
答案 2 :(得分:3)
除了@The Elite Gentleman的回答,节点不会为异步I / O函数生成线程。节点下的所有内容都在单线程事件循环中运行。这就是为什么避免某些I / O函数的同步版本非常重要,除非绝对必要,例如fs.readSync
您可以阅读这篇优秀的博文,了解一些见解:http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/
答案 3 :(得分:1)
我正在研究同样的问题,因为这个异步IO模式对我来说是非常新的。我在infoq.com上发现这个话题让我很开心。这家伙很好地解释了异步IO实际驻留的位置(操作系统 - >内核)以及它如何嵌入node.js作为执行IO的主要习惯用法。享受!
http://www.infoq.com/presentations/Nodejs-Asynchronous-IO-for-Fun-and-Profit
答案 4 :(得分:0)
node.js允许程序员通过强制使用回调来执行异步IO。现在回调类似于我们长期用来处理javascript中的DOM事件的旧异步函数! 例如
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'
答案 5 :(得分:0)
来自https://en.wikipedia.org/wiki/Asynchronous_I/O
同步阻止I / O
一种简单的I / O方法是启动访问,然后等待它完成。
在通信进行时会阻止程序的进度,使系统资源空闲。
异步I / O
或者,可以启动通信,然后执行不需要完成I / O的处理。
任何依赖I / O完成的任务......仍然需要等待I / O操作完成,因此仍然被阻止,
但是其他不依赖于I / O操作的处理可以继续。
示例:强>
https://en.wikipedia.org/wiki/Node.js
Node.js有一个事件驱动架构能够异步I / O