2016-09-20 60 views
0

所有:快递手柄CPU沉重的请求

我非常新的节点和快递,我不知道是否有人可以给我一点解释服务器如何表达作品时处理该请求,我得到了服务器卡的时候做出一些CPU钙重要求,对于简单的例子:

app.get("/", function(req, res){ 
    // some long time math calculation in for loop or while to get data 
    res.json(data); 
}) 

我认为节点是事件循环基于单个进程,当任务发射,任务将被放入一个线程池,而这个单一的过程不断地问,如果它完成或者不是,对于我的例子,我认为app.get可以将处理函数任务放在该池中并等待其他请求,但不幸的是它似乎并不适用于临时t的方式。

那么它在app.get中的工作原理以及如何分离这个沉重的calc任务并使这个请求处理程序等待其他请求?

任何示例将意识到

由于

+0

不要在主线程中进行繁重的计算,请使用节点簇! – Ali

回答

0

的NodeJS,如浏览器的JavaScript,是单线程。要执行的任务(例如您的处理函数)被放入事件队列中,并按顺序执行。因此,如果一个函数花费很长时间执行,它将阻止队列中的其他内容(例如另一个请求)运行。

如果您不希望长时间计算阻止处理其他请求,则可以通过事件循环多次分割它,例如,与setImmediate()。见this page on the NodeJS event loop

(可能更好)选项是在另一个线程/进程中执行计算,以便它根本不会干扰请求处理。

+1

另一种选择是将CPU密集型操作委托给另一个进程。事件循环在等待远程操作的结果时不会阻塞。 –

+0

编辑,谢谢。 – qxz

+0

为什么downvote? – qxz