Ale*_*ing 2 javascript reactor node.js
我有一个非常简单的实用程序脚本,我用JavaScript编写了node.js,它读取文件,进行一些计算,然后编写输出文件.当前形式的源代码如下所示:
fs.readFile(inputPath, function (err, data) {
if (err) throw err;
// do something with the data
fs.writeFile(outputPath, output, function (err) {
if (err) throw err;
console.log("File successfully written.");
});
});
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想知道在这种情况下是否有任何缺点使用这些函数的同步变化,如下所示:
var data = fs.readFileSync(inputPath);
// do something with the data
fs.writeFileSync(outputPath, output);
console.log("File successfully written.");
Run Code Online (Sandbox Code Playgroud)
对我来说,这比回调品种更容易阅读和理解.在这种情况下,有没有理由使用前一种方法?
我意识到速度对于我在本地运行的这个简单脚本来说根本不是问题,但我有兴趣理解它背后的理论.什么时候使用异步方法有帮助,什么时候不帮助?即使在生产应用程序中,如果我只是在读取文件,然后等待执行下一个任务,是否有任何理由使用异步方法?
重要的是您的节点进程在同步IO发生时需要执行的操作.对于由单个用户在命令行运行的简单shell脚本,同步IO完全没问题,因为如果你正在进行异步IO,那么你所做的就是等待IO无论如何都要回来.
但是,在具有多个用户的网络服务中,您永远不能使用任何同步IO调用(这是节点的整个点,所以当我这样说时请相信我).这样做会导致所有连接的客户端停止处理,这是完全的厄运.
经验法则:shell脚本:好的,网络服务:verboten!
为了进一步阅读,我在这个答案中做了几个类比.
基本上,当节点在网络服务器中执行异步IO时,它可以要求操作系统执行许多操作:读取一些文件,进行一些数据库查询,发送一些网络流量,并在等待异步IO准备就绪时,可以在主事件线程中执行内存/ CPU事务.使用此体系结构,节点可以获得相当好的性能/并发性.但是,当发生同步IO操作时,整个节点进程只会阻塞并且绝对不会执行任何操作.它只是等待.无法接收新连接.没有处理发生,没有事件循环滴答,没有回调,没有.只需1个同步操作就可以为所有客户端停止整个服务器.你根本不能这样做.它的速度或类似速度无关紧要.本地文件系统或网络请求无关紧要.即使您花费10ms从每个客户端的磁盘读取一个小文件,如果您有100个客户端,客户端100将等待一整秒,同时为客户1-99反复读取该文件一次.
| 归档时间: |
|
| 查看次数: |
308 次 |
| 最近记录: |