以下两个图表是我对事件驱动的Web服务器(如Node.js + JavaScript)与非事件驱动的Web服务器(如IIS + C#)相比如何工作的理解
从图中可以很容易地看出,在传统的Web服务器上,用于执行3次长时间运行操作的线程数大于事件驱动的Web服务器上的线程数(3 vs 1)
我认为我的"传统网络服务器"计数正确(3),但我想知道事件驱动的(1).这是我的问题:
假设在事件驱动的场景中只使用了一个线程,这是正确的吗?这可能不正确,必须创建一些东西来处理I/O任务.对?
事件服务器是如何处理I/O的?假设I/O是从数据库中读取的.我怀疑Web服务器必须创建一个线程来交接连接数据库的工作?对?
如果事件驱动的Web服务器确实创建了处理I/O的线程,那么增益是多少?
我混淆的一个可能的解释可能是,在传统和事件驱动的两种情况下,确实创建了三个单独的线程来处理I/O(图中未显示),但区别在于它上的线程数量. Web服务器本身,而不是I/O线程.那是准确的吗?
下面的代码创建一个文本文件,然后读取它,覆盖它,然后再次读取它.除了创建文件之外,还使用Node.js async readFile和writeFile执行三个I/O操作.
我不明白为什么第一次读取没有返回错误但没有数据.此代码的输出是:
即使操作是以任意顺序发生的(由于它们的异步性质),我也不希望得到一个"空数据"对象.
任何想法为什么我在读取文件时得到一个空数据(没有错误)?
我有什么办法可以确保读取文件内容吗?
var fs = require('fs');
var fileName = __dirname + '/test.txt';
// Create the test file (this is sync on purpose)
fs.writeFileSync(fileName, 'initial test text', 'utf8');
console.log("Starting...");
// Read async
fs.readFile(fileName, 'utf8', function(err, data) {
var msg = "";
if(err)
console.log("first read returned error: ", err);
else {
if (data === null)
console.log("first read returned NULL data!");
else if (data === "")
console.log("first …
Run Code Online (Sandbox Code Playgroud) 我刚开始尝试在我的Node.js应用程序上实现Promises.现在我正在检查用户和密码是否存在,然后使用mongodb查找它们如果找不到用户它设置了promise.reject()但是它过早地返回了promise并且它仍处于挂起状态.如果有人可以帮助或给我关于如何重构的想法,将不胜感激.