在基于PHP(或Java/ASP.NET/Ruby)的Web服务器中,每个客户端请求都在新线程上实例化.但是在Node.js中,所有客户端都运行在同一个线程上(它们甚至可以共享相同的变量!)我知道I/O操作是基于事件的,所以它们不会阻塞主线程循环.
我不明白的是为什么Node的作者选择它是单线程的?这让事情变得困难.例如,我无法运行CPU密集型功能,因为它阻塞了主线程(并阻止了新的客户端请求),因此我需要生成一个进程(这意味着我需要创建一个单独的JavaScript文件并在其上执行另一个节点进程) ).但是在PHP中,cpu密集型任务不会阻止其他客户端,因为我提到每个客户端都在不同的线程上.与多线程Web服务器相比,它有哪些优势?
注意:我已经使用群集来解决这个问题,但它并不漂亮.
可能重复:
为什么以及何时使用节点js?
有人能告诉我为什么所有关于node.js的大惊小怪?与在一些php框架中编写的相比,用node.js编写的常规网站(比如博客)更快吗?我知道用node.js编写的web服务器会比apache更快但是一个真正的Web应用程序如何创建线程或类似的东西呢?
Node.js通过将基于事件的模型放在其核心,使用事件循环而不是线程来解决"每个连接一个线程问题".所有昂贵的I/O操作总是与启动的操作完成时执行的回调异步执行.
如果任何操作发生的观察由epoll()等多路复用机制处理.
我的问题现在是:
为什么在使用阻塞Systemcalls select/epoll/kqueue时NodeJS阻塞?
或者根本不是NodeJS Single Threaded,所以需要第二个Thread
来观察select/epoll/kqueue的所有I/O操作?
在他们的arXiv论文中,Julia的原作者提到了以下内容:
2.14 Parallelism.并行执行由Julia在标准库中实现的基于消息的多处理系统提供.语言设计通过提供对称协程来支持这些库的实现,协同协程也可以被认为是协同调度的线程.此功能允许异步通信隐藏在库中,而不是要求用户设置回调.朱目前不支持本地线程,这是一种限制,但具有避免同步共享内存的使用的复杂性的优点.
他们说朱莉娅不支持原生线程是什么意思?什么是本机线程?
其他解释性语言(如Python或R)是否支持这种并行性?朱莉娅独自一人吗?
我正在考虑将NodeJS用于我的网站而不是我当前的PHP + Apache设置.进行此切换是否有任何重大的不利因素/优势?
我的网站将收到大量的小请求和偶尔的请求,需要在服务器端进行大量计算.
我有一台服务器,我可以安装任何我想要的东西,所以托管不是这个决定的一个因素.虽然我希望在最小化内存和处理要求的同时最大限度地提高性能
我想我的主要问题是,NodeJS何时适合网站?
举个例子
var runInfinite = function(){
while(1)
{
// Do stuff;
}
};
setTimeout(runInfinite, 0);
Run Code Online (Sandbox Code Playgroud)
是否有可能打破运行无限的runInfinite函数形式?我的意思是可以在不使用flag或return语句的情况下从另一个函数中删除此函数吗?
我读到javascript语言具有帮助实现非阻塞IO的特性,这有助于node.js等项目的成功.我的问题是这些特性是什么?为什么在其他语言中实现非阻塞IO更难?
node.js ×4
javascript ×3
php ×2
architecture ×1
dom-events ×1
julia ×1
nonblocking ×1
python ×1
r ×1