Javascript node.js单线程模型如何处理并发请求?
两个并发请求R1和R2到达Javascript node.js单线程模型如何处理并发请求?,javascript,node.js,Javascript,Node.js,两个并发请求R1和R2到达node.js服务器。Node.js正在使用单线程T1运行。T1处理请求R1需要5秒钟。假设这次 花费在一些大函数的实际处理中,没有等待/IO调用 我的问题是-请求R2是否会在5秒后处理(一旦R1完成) 或者两者(R1和R2)都将以循环方式运行 如果答案是连续的(即R2将在5秒后被占用),我的后续问题是假设我有5k个http并发请求,每个请求需要2ms,那么最后一个请求将在5k*2ms=10秒后被服务。还不错吧?我需要在这里进行集群吗?如果您的函数受CPU限制,您将绑定
node.js
服务器。Node.js
正在使用单线程T1运行。T1处理请求R1需要5秒钟。假设这次
花费在一些大函数的实际处理中,没有等待/IO调用
我的问题是-请求R2是否会在5秒后处理(一旦R1完成)
或者两者(R1和R2)都将以循环方式运行
如果答案是连续的(即R2将在5秒后被占用),我的后续问题是假设我有5k个http并发请求,每个请求需要2ms,那么最后一个请求将在5k*2ms=10秒后被服务。还不错吧?我需要在这里进行集群吗?如果您的函数受CPU限制,您将绑定事件循环。你有两个选择
.nextTick()
,以允许事件循环中的其他内容稍后完成并恢复R2
将在5秒后(一旦R1
完成)被占用,或者两者(R1
和R2
)将以循环方式运行
是,如果R1是同步的,则只有在R1完成后才会占用R2
简而言之,您可以通过谷歌nodejs事件循环
。有很多优秀的文章解释了Node.js如何使用事件循环来处理请求
事件循环允许Node.js通过尽可能将操作卸载到系统内核来执行非阻塞I/O操作(尽管JavaScript是单线程的)。
(来源:)
正确的说法是Node.js是单线程的。如果被长时间运行的任务阻止,它将无法处理任何其他内容。在您的情况下,您应该将R1
分解为更小的部分以进行异步处理,或者您可以使用a将操作卸载到另一个线程
如果回答是连续的(即R2
将在5秒后处理),我的后续问题是假设我有5k个http并发请求,每个请求需要2毫秒,那么最后一个请求将在5k*2ms=10秒后处理。还不错吧?我需要在这里进行集群吗
视情况而定。2ms实际上是计算机处理很多事情的很长时间。在进行集群之前,应该重构代码,以尽量减少上述请求处理程序中的阻塞代码。在购买更多用于集群的服务器之前,您可以通过使用库将应用程序克隆到其他线程来充分利用CPU核心。一个设计良好的Node.js应用程序应该能够处理数千个请求而不会出现问题。否则,您可能会重新考虑Node.js是否最适合您的应用程序
奖励:让我们听听Node.js的发明者
节点运行事件循环系统,而不是线程。每个请求触发事件循环,使R1和R2并行运行。那么这里的单线程模型是什么?你的意思是两个请求将触发两个事件,事件循环将通过单线程以循环方式执行相应的事件处理程序,完成后将发送回响应吗?同样,它是一个均匀循环系统,不是线程系统,不要考虑线程,谢天谢地,它是在一个您无权访问的较低级别上处理的。这两个请求将同时运行。@MarcoBiolo请在评论之前进行实验。一个简单的谷歌搜索会告诉你Node.js是单线程的。如果第一个请求被阻塞,这两个请求将不会并行运行。@TimWong节点运行一个事件循环,它是一个不同类型的系统,实现不会影响事件循环的工作方式,并且您不需要担心线程,您只需了解事件循环即可。当然,事件循环中的块将被阻止,这就是它的工作原理!如果您想了解更多信息,请查看。如果我不执行您提到的两个步骤,R2请求将在何时处理?是否在5秒之后(即连续)?@user3198603是的,只要没有典型的客户端超时。不是很多客户端会等五秒钟让服务器应答并开始处理(虽然web浏览器会)。当你说“不是很多客户端会等五秒钟让服务器应答并开始处理(虽然web浏览器会)时,我不明白。”?R2的浏览器/客户端将等待秒。对吗?如果R1是同步的,你所说的
是什么意思。
?这些是从浏览器发送到节点服务器的http请求。那么什么是同步的呢?我指的是请求处理程序中的逻辑。例如,一个简单的while循环是同步的,因为在while循环完成之前,应用程序无法执行任何其他操作。操作是异步的,因为文件I/O是在后台处理的,应用程序能够同时处理其他请求。谢谢。关于的一个问题是通过将应用程序克隆到其他线程来充分利用CPU核心。假设我的node.js(单线程)在8080端口上运行,这是在使用一个内核。要通过集群
库使用另一个核心,它会启动另一个节点进程并在同一端口8080上侦听吗?虽然我不太确定是如何实现的,但官方文档中的示例表明,工人可以共享任何TCP连接(即您的情况下的8080
端口)。有关更多说明,请参阅。还请注意,当您对应用程序进行集群时,应用程序应该是可用的,否则事情将变得不可预测。。。或者您可以使用child_进程将操作卸载到另一个线程我不知道另一个线程是什么意思?我们能多吃点吗