当前位置: 首页 > 知识库问答 >
问题:

Node 如何处理线程池中只有几个线程的密集型文件操作?

单于轶
2023-03-14

我理解了Node是如何使用操作系统的去多路复用器使非阻塞调用异步的,它通过避免创建一百万个线程(每个客户端一个线程)来节省大量的内存成本,从而在单个线程中处理所有请求。它还帮助开发人员在更简单的应用程序中处理并发问题way.All目前为止做得很好。

当线程池进入节点留档时,我的麻烦就开始了picture.its在节点留档中,只要操作系统的多路分解器支持不好,节点就使用线程池(默认为4个线程,最大128个线程)来实现类似的functionality.It还提到文件操作使用线程池而不是操作系统的多路分解器。

因此,我担心的是,假设我正在编写一个web服务器,每个客户端需要完成很少的文件操作,那么如果一百万个客户端同时使用我的应用程序,那么节点的4个工作线程可能永远无法满足所有请求,因为默认情况下,节点的线程池此时可以处理4个文件操作。其他人必须等到这些线程被释放。即使考虑节点线程池128个线程的最佳情况,考虑到Tomcat可以在阻塞模式下并行处理数百万个文件操作,也未必更好。

这让我想到,如果Web服务器有太多的IO操作(主要是文件和数据库相关),Node真的是正确的选择吗?

共有1个答案

王凯旋
2023-03-14

据我所知,Node.js背后的主要思想之一是,您应该设计服务器应用程序,以便持久、可变状态数据的存储或检索尽可能快地被其他系统击败。

如果您这样做,您就可以将节点进程的多个实例集群在同一台计算机或不同的计算机上,每个实例都运行您的代码。

因此,无论采用何种技术实现,您都可以获得比单一整体流程更高的可伸缩性。

这个概念就是Node.js的名字。每个进程应该是某个集群中的一个节点。

我不知道你自己,但我不想重新实施企业数据存储解决方案并将它的功能混合到我的业务逻辑中,因为有些开发人员只关注相关的问题,而大多数应用程序开发人员不可能做得和他们一样好。

但是,您实际测试过是否存在性能问题吗?如果没有,你怎么知道有问题呢?大多数文件可能只打开一小段时间。

在技术层面上,Node.js可以同时打开的文件数量是有限制的。达到该级别后,文件操作将失败,并出现EMFILE错误(打开的文件太多)。为了超过这个数量,有一个Node.js模块,您可以使用https://github.com/isaacs/node-graceful-fs对进一步的文件操作进行排队。

 类似资料:
  • 我需要创建一个并行执行多个操作的应用程序。我曾考虑过使用线程或线程池,但我以前从未使用过,所以我发现这相当困难。Thread应按以下方式工作: 所有系统应同时运行。你认为我应该如何实现这一点?

  • 本文向大家介绍C#线程处理系列之线程池中的I/O线程,包括了C#线程处理系列之线程池中的I/O线程的使用技巧和注意事项,需要的朋友参考一下 一、I/O线程实现对文件的异步  1.1  I/O线程介绍: 对于线程所执行的任务来说,可以把线程分为两种类型:工作者线程和I/O线程。 工作者线程用来完成一些计算的任务,在任务执行的过程中,需要CPU不间断地处理,所以,在工作者线程的执行过程中,CPU和线程

  • 从主线程读取文件 将读取值存储到blockingqueue中,另一个线程将从中访问和处理。 有另一个线程要写入另一个文件。 但我不知道如何做到这一点。如果我声明了一个fixedthreadpool,我将无法控制哪个线程执行什么操作,但在这种方法中,这是否类似于顺序处理,因为线程属于不同的池? 如果有人能指导我如何执行此操作,这将对我有很大帮助。

  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind

  • 我编写了代码示例: 每100毫秒提交一个新任务(总任务量-20)。每个任务持续时间-0.5秒。因此,可以并行执行5个任务,最佳执行时间为:20*100 500=2.5秒,池应创建5个线程 但我的实验显示为9.6秒。我打开jsvisualvm查看池创建了多少线程,我看到只创建了一个线程: 请更正我的线程池配置不正确的地方。

  • 问题内容: 关于我的上一个问题,我发布了: 我必须阅读几个非常大的txt文件,并且必须使用多个线程或一个线程来执行此操作,具体取决于用户输入。 假设我有一个主要方法来获取用户输入,并且用户请求一个线程,并希望为该线程处理20个txt文件。我将如何完成?请注意,以下内容不是我的代码或其设置,而是“想法”的含义。 例: 因此,总而言之,我将如何用一个线程完成此任务? 有20个线程? 用户建议使用thr