Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js单线程模型如何处理并发请求?_Javascript_Node.js - Fatal编程技术网

Javascript node.js单线程模型如何处理并发请求?

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限制,您将绑定

两个并发请求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限制,您将绑定事件循环。你有两个选择

  • 转换到与其他进程的不同通信模型,可能运行它们自己的事件循环:pre-fork或worker-MPM。如果希望使用,可以从节点内生成这些进程
  • 限制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_进程将操作卸载到另一个线程我不知道另一个线程是什么意思?我们能多吃点吗