以下两个图表是我对事件驱动的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线程.那是准确的吗?
Javascript是单线程的.那么回调函数和它的包含函数是否在与主循环/事件循环相同的线程上执行?
database.query("SELECT * FROM hugetable", function(rows) { // anonymous callback function
var result = rows;
console.log(result.length);
});
console.log("I am going without waiting...");
Run Code Online (Sandbox Code Playgroud)
如果query()方法及其回调函数在与事件循环相同的线程上执行,则会发生阻塞.如果不是为什么Javascript被称为单线程?
任何人都可以帮助验证javascript(browser/node.js)是否在场景后面使用多个线程以实现非阻塞?
谢谢,
朋友们,我看到了你的意见和答案.对不起,我对javascript很新.我很困惑,单线程asyn调用不会阻塞.如果有100个用户从hugeTable请求数据,这可能每个并发一分钟,并且事件循环将这些任务分配到一个队列并依次执行它们,query()方法执行如何不阻止事件循环,因为它们全部打开一个单线程?
布拉德回答了这一部分
NGNIX使用epoll通知来了解套接字上是否有任何要读取的数据。
假设:有两个对服务器的请求。nginx收到关于这两个请求的通知,并开始执行以下操作:
收到第一个请求
解析头
检查胸围(体型)
发送第一个请求到上游服务器
等等
nginx是单线程的,并且只能同时执行一项操作。
但是第二个请求会怎样?
在解析第一个请求时,nginx是否收到第二个请求?
还是在完成第一个请求后开始处理第二个请求?
或其他我不理解的东西。
如果1.是正确的,那么我不知道在单个线程中怎么可能。
如果2.正确,那么nginx怎么会这么快?因为nginx会顺序处理所有传入请求。在任何给定时间只能处理一个请求。
请帮助我理解。谢谢
我在一篇文章中读到 Node.js 是单线程的。问题是如果我们在不同的端口运行多个 Node.js 文件怎么办?它们是否有自己的线程,或者全部都在 Node.js 主线程下?有人可以阐明我现在处于黑暗面的主题吗?