如果我们可以更改线程池使用的线程数,为什么还需要节点集群?

塔贝特萨卜哈

标题基本上说明了一切,当我们可以更改 libuv 线程池使用的线程数时,为什么还要创建节点工作程序?

TJ克劳德

libuv线程池不用于JavaScript代码,仅用于Node.js的的API的一个子集(虽然它使用的最重要的人之一,fs)。文档

Node.js 会尽可能使用异步系统 API,但在它们不存在的情况下,libuv的线程池用于创建基于同步系统 API 的异步节点 API。使用线程池的 Node.js API 有:

  • 所有fsAPI,除了文件观察器 API 和那些显式同步的 API
  • 异步加密 API,例如crypto.pbkdf2(), crypto.scrypt(), crypto.randomBytes(), crypto.randomFill(),crypto.generateKeyPair()
  • dns.lookup()
  • 所有zlibAPI,显式同步的 API 除外

因此libuv线程池的大小有助于处理大量重叠fs和相似的调用,但这并不是全部。

libuv如果您有需要同步完成大量工作的 JavaScript 代码,池将无济于事;该代码在单个线程上运行(除非您启动工作程序)。此外,Node.js 使用同一个线程来检查异步工作的libuv完成(包括完成)。事件循环页面

下图显示了事件循环操作顺序的简化概述。

   ┌───────────────────────────┐
┌─>│           timers          │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │     pending callbacks     │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │       idle, prepare       │
│  └─────────────┬─────────────┘      ┌───────────────┐
│  ┌─────────────┴─────────────┐      │   incoming:   │
│  │           poll            │<─────┤  connections, │
│  └─────────────┬─────────────┘      │   data, etc.  │
│  ┌─────────────┴─────────────┐      └───────────────┘
│  │           check           │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
└──┤      close callbacks      │
   └───────────────────────────┘

这样即使没有运行您的 JavaScript 代码,一个线程也会做很多工作。

如果您启动工作线程,它们每个都有自己的事件循环,并且可以处理与其工作相关的完成,即使另一个线程正忙于执行占用大量 CPU 的工作。

因此,工作线程在任何给定情况下是否有用在很大程度上取决于您的代码在做什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果我们可以使用Selenium,为什么还需要像BeautifulSoup这样的解析器?

如果我们使用notify_one()唤醒线程,在C ++中是否还需要yield()?

如果我们有 <!DOCTYPE html>,为什么还需要 <html> 标签?

番石榴 LoadingCache.refresh - 如果我们可以只使用 Cache.invalidate,为什么还需要它?

如果我们还需要包含标准库头文件,为什么还要指定命名空间?

除了测试,为什么我们还需要匕首2?

当我们有组件时,为什么还需要服务?

既然我们有多播委托,为什么还需要事件呢?

C ++完美转发:如果可以使用const_cast(),为什么还需要forward()?

如果有GIL,为什么我们需要线程锁?

当我们已经有了更强大的向量时,为什么还需要堆栈?

如果我已经有了 Kubernetes(或 mesos),为什么还需要使用 Spring Cloud?

为什么我们允许从线程池线程修改表单标题?

为什么我们需要使用线程来运行Kafka使用者?我们需要多少个线程?

在SQL中,如果可以使用NOT NULL和UNIQUE约束代替主键,为什么还需要主键?

Java多线程-如果拥有共享堆,为什么我们需要查看主内存(RAM)?

当我们有ViewModels时,我们还需要onSaveInstanceState()吗?

为什么我们需要JDBC的连接池?

如果使用Mockito,我是否还需要Guice?

我们还需要使用&pound;吗?或&#163; 而不是在HTML中使用英镑符号?

为什么我们需要通知()用于线程间通信

为什么我们真的需要多个netty老板线程?

为什么我们需要一个Runnable来启动线程?

为什么使用.children使.modal工作后,我还需要另一个$()

我们可以更改JVM线程调度程序吗?

如果需要更改input_shape,为什么我们需要include_top = False?

我们在React挂钩中还需要功能setState方法吗?

我们是否还需要为按字段排序的集合设置索引?

我们还需要HTML5中的斜杠吗?