javascript - 了解异步模块中的并发/并行性 - Node JS

标签 javascript node.js concurrency async.js

我有一个网络服务器,上面运行着一个 Node 进程,由 pm2 管理,网络服务器有 16 个可用内核。

Node 进程使用异步模块管理任务队列。如果 Node 进程与其交互的服务断开连接,这个任务队列可能会增长到超过 10,000 个,具体取决于传入事件的数量。

队列会在连接断开时维护这个任务列表,然后当连接重新建立时,队列中的任务就会被执行。

文档是这样说的...

Tasks added to the queue are processed in parallel (up to the concurrency limit). If all workers are in progress, the task is queued until one becomes available. Once a worker completes a task, that task's callback is called.

我的问题是这些......

  1. 如果队列中有 10,000 个任务,并且我将并发级别设置为 1,那么我认为这些基本上一次执行 1 个是否正确?如果是这样,我想这意味着如果添加新任务,这个队列可能永远不会被完全耗尽?

  2. 如果我将并发值设置为 16,它实际上是否会并行运行 16 个任务,从而利用每个 CPU 核心?还是并发由其他东西管理?

  3. 任务如何并行运行?我的理解是,单个 Node 进程一次只能使用一个内核,因为它是单线程的。

  4. 关于异步模块如何管理并行任务,我是否完全忽略了这一点?!

提前谢谢你们这些聪明的人!

最佳答案

1) 是的,它们将被串联执行。 如果您不为任务设置超时,那么您可能永远不会耗尽队列。

2)没有。所有任务都将在您的 Node 应用程序运行的同一核心上执行。 将任务分配给 worker,你将获得多进程队列(看看子进程和 ipc)

3) 如果任务是阻塞代码,则没有任何内容是并行的。 但是,如果您写入磁盘/网络,则您正在进行异步工作,并且在等待答案时,引擎会继续执行其余代码

4) 一点点。但你正在努力解决它。 ;)

关于javascript - 了解异步模块中的并发/并行性 - Node JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53326830/

相关文章:

node.js - 在 route 的 res.redirect ('back' ) 之后重新加载页面

javascript - 使用键获取对象数组中的对象

java - ExecutorService 的奇怪行为

java - Double check 中不稳定的东西是什么?

javascript - 将此代码放在我的 Angular 元素中的哪里?

javascript - Javascript 中的任务运行器

node.js - heroku 上的 Bower 模块缓存

mysql - Postgres 的并发参数

javascript - d3 如何将 geojson 中的 ID 添加到路径

javascript - 将类添加到除第一个表之外的所有表