【发布时间】:2017-08-17 04:46:31
【问题描述】:
假设我正在使用节点服务器,并且有一个 api 正在生成从 1 到 1 百万的系列(即非常巨大的 cpu 操作),所以在这种情况下,其他到达服务器的请求排队(并且等待很长时间轮到他们这会扼杀用户体验),因为节点是单线程的。
我们可以用 node.js 做任何其他解决方案吗?不用等待轮到他们的其他请求这么久?
【问题讨论】:
标签: javascript node.js
假设我正在使用节点服务器,并且有一个 api 正在生成从 1 到 1 百万的系列(即非常巨大的 cpu 操作),所以在这种情况下,其他到达服务器的请求排队(并且等待很长时间轮到他们这会扼杀用户体验),因为节点是单线程的。
我们可以用 node.js 做任何其他解决方案吗?不用等待轮到他们的其他请求这么久?
【问题讨论】:
标签: javascript node.js
如果当前请求的计算量很大,node.js 服务器如何处理下一个请求?
不会 - 如果该计算发生在主线程上并且没有分成更小的部分。
要在 CPU 密集型任务期间有机会处理其他请求,您需要:
重要的是您需要在 V8 线程中经常展开堆栈,以便事件循环有机会尽可能频繁地处理事件。请记住,当您进行需要 10 秒的长时间计算并将其分成 1000 个较小的部分时,您的服务器仍将被阻止服务新请求或任何其他 I/O 或事件 1000 次,每次持续 10 毫秒.
如果您有大量 CPU 密集型操作,那么我强烈建议您将它们移出处理请求的进程,这不仅是因为阻塞了事件循环,还因为在这种情况下您希望利用所有您的内核同时进行,因此最好让与 CPU 中的内核一样多的进程(或线程)执行 CPU 繁重的工作(或者使用超线程可能更多)并拥有所有的 I/O-将操作绑定在一个单独的进程中,该进程本身不会处理 CPU 繁重的操作。
【讨论】:
单线程并不意味着进程将由先到先服务安排。我真的不认为以先到先服务的方式处理多个请求,所以这不是什么大问题。但是,由于请求处理时间过长,整个系统会变慢。
为此,节点有一个解决方案:
https://nodejs.org/api/cluster.html
这样做是,您基本上可以生成应用程序的多个实例,所有实例都在同一个端口上运行,因此如果您有多个请求,其中一小部分花费的时间太长,那么其他子进程在集群可以响应后续请求。
【讨论】: