Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Node.js NodeJs:单线程问题?_Node.js_Multithreading_Express_Event Driven_Single Threaded - Fatal编程技术网

Node.js NodeJs:单线程问题?

Node.js NodeJs:单线程问题?,node.js,multithreading,express,event-driven,single-threaded,Node.js,Multithreading,Express,Event Driven,Single Threaded,当我发现这个问题时,我正在学习NodeJS。我在express应用程序中创建了一个路由,当线程点击该路由时,它会调用一个睡眠功能,10秒后醒来。在此期间,我无法访问系统中的其他路由。我在django也试过同样的方法,一切都很好。我如何克服这个问题。当用户上载一些图像或文件时,这是否会成为一个问题 让我们了解一下这一点。我听过一种叫做集群的东西,但不明白它是什么。集群基本上是在同一个进程中产生多个实例,这样就可以实现基于进程的并行性 这就是问题所在:假设您生成了4个应用程序实例,并向其发送了100

当我发现这个问题时,我正在学习NodeJS。我在express应用程序中创建了一个路由,当线程点击该路由时,它会调用一个睡眠功能,10秒后醒来。在此期间,我无法访问系统中的其他路由。我在django也试过同样的方法,一切都很好。我如何克服这个问题。当用户上载一些图像或文件时,这是否会成为一个问题


让我们了解一下这一点。我听过一种叫做集群的东西,但不明白它是什么。

集群基本上是在同一个进程中产生多个实例,这样就可以实现基于进程的并行性

这就是问题所在:假设您生成了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秒长的请求。

NodeJs被设计为异步,处理来自单线程的所有请求。
因此,主线程上任何耗时的操作(阻塞)都会暂停其他请求,类似于您面临的睡眠(尽管JS中没有内置的睡眠支持)

为了执行诸如I/O之类的阻塞操作,NodeJs提供或,使流程不必等待操作完成(这基本上是异步行为)

要回答的是,当用户上载一些图像或文件时,这可能是一个问题? 答案是否定的。你应该使用回扣或承诺

使用回调和内置的
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
。函数
doSomething
仅在读取文件完成后调用

此外,您不需要集群来解决这个问题。集群用于产生多个NodeJs进程,本质上是为了平衡多核系统上的负载


在开始使用express之前,我建议您先学习一些入门教程,这里有两个很棒的教程,其中一个是节点艺术

我承认我不太明白这个例子。特别是,在4个请求的特定情况下,有没有其他方法可以执行得更好?因为标准Node.js库没有睡眠功能,那么睡眠是如何实现的?你的意思是你在使用这个答案中的方法:?在这种情况下,我使用了有趣的setTImeoutin,您应该共享代码,因为
setTimeout
不会阻止事件循环接受更多请求。