NodeJs:单线程问题?

时间:2017-05-22 11:46:19

标签: node.js multithreading express event-driven single-threaded

当我发现这个问题时,我正在学习节点js。我在快递app中做了一个路线,当线程到达路线时,它调用睡眠功能并在10秒后唤醒。在此期间,我无法访问系统中的其他路由。我在django尝试了同样的一切,一切正常。我该如何克服这一点。当用户上传某些图像或文件时,这可能是一个问题吗?

对此有所了解。我听到一种叫做聚类的东西,但不明白它是什么。

2 个答案:

答案 0 :(得分:0)

群集基本上会产生同一进程的多个实例,因此您可以拥有基于进程的并行性。

以下是它的原因:假设您生成了4个应用实例并向其发送了1000个请求。

First instance will take the first request and process it.
Second instance will take the second request and process it.
Third instance will take the third request and process it.
Fourth instance will take fourth request and process it.
The instance that first completes processing its request will process the 5th request 

等等。

基于流程的并行性有什么问题:

假设您收到4个请求,并且您知道他们将分别花费5分40秒30秒45秒来处理。它们都是在时间t_0到达。

您将每个请求分发到实例。

在t_0 + 30秒,第一个实例将完成处理其各自的请求。

在t_0 + 40秒,第二个实例将完成处理其各自的请求。

在t_0 + 45秒,第三个实例将完成处理其各自的请求。

从t_0 + 45秒开始,以t_0 + 300秒结束,除了一个实例之外的所有实例都会空闲等待并且在第一个实例仍在处理300秒长的请求时执行大量任何操作。

答案 1 :(得分:0)

NodeJs设计为异步,处理来自单线程的所有请求。
因此,主线程上的任何耗时操作(阻塞)都会将其他请求置于保持状态,类似于您在睡眠中所面临的情况(尽管JS中没有构建支持睡眠的)。 p>

为了执行I / O等阻塞操作。 NodeJ提供callbackspromises,使进程不等待操作完成(这基本上是异步行为)。

回答当用户上传某些图像或文件时,这可能是个问题吗? 答案是。你应该使用回调或承诺。

使用回调和fs模块中的内置来异步读取文件。

const fs = require('fs');
function doSomething(err, data){
  //do some operations
}
function testAsync(){

fs.readFile('path/to/someFile',doSomething)
console.log('I log first');
}

此处节点进程不会等待readFile完成,并将继续提前记录I log first。功能doSomething仅在帖子 readFile 完成后调用。

此外,您不需要群集来解决此问题。聚类用于生成多个NodeJ进程,主要是为了平衡多核系统上的负载。

我建议你在开始使用express之前先阅读一些介绍性的教程,有很多很棒的教程,其中一个是节点艺术