网络请求的并行化对 Node.js workers 有用吗?

Is parallelization of network requests a good use for Node.js workers?

我正在试验 Node.js worker_threads 模块,目的是 'collecting' 对不同 API 的许多请求的结果。这对工人来说是一个很好的用例吗?

例如:

import { Worker } from 'worker_threads'

const API_ADDRESSES = [... maybe 20 different URIs]

const results = await Promise.allSettled(
  API_ADDRESSES.map(
    uri => new Promise(
      (resolve, reject) => {
        const worker = new Worker(... filepath.js, { workerData })
        worker.on('message', resolve)
        worker.on('error', reject)
      }
    )
  )
)

// The Worker then uses axios/node-fetch/etc to make a network request and returns data as a message

如果这对工人来说不是一个好的用例,什么是更好的方法?另外,如果这不是一个好主意,为什么这对工人来说不是一个好的用例?

试过这个,似乎工作正常,但我真的不知道如何从性能角度评估它。

==== 编辑

我想尝试这种方法而不是

的原因
await Promise.allSettled(API_ADDRESSES.map(uri => fetch(uri, {....})))

是每个结果我可能想在返回之前处理响应(即结果可能是很多我想要相关系数的数字)。

基本上,Node.js 中的 http 请求不是阻塞操作(大多数情况下是这样)。所以在这里使用工人是多余的,不推荐。

what would be a better approach

这可能会因情况而异,但这对于大多数情况应该足够了:

await Promise.all([fetch(...), fetch(...),...]);

可以找到更多信息 here

好吧,这似乎工作正常,因为您希望在不同的线程中完成调用。但是众所周知,NodeJS 已经具有异步 IO。因此,要完成网络作业,使用一个简单的请求库就足够了。

另一方面,

worker_threads 更重于合并 CPU 使用案例。工作线程通过 IPC 调用相互通信,因为它们表现为完全独立的进程生成。

worker_threads 的一些用例是

  1. 创建 http_servers 的集群。
  2. 正在新线程上分配 CPU 密集作业。 等...

Is parallelization of network requests a good use for Node.js workers?

不是真的。节点已经并行处理网络请求。

Is parallelization of CPU-heavy processing of network requests a good use for Node.js workers?

可能吧。如果网络请求的处理将花费大量时间,则并行处理该处理可以带来性能优势。您可以通过对这两种方法进行基准测试来确定这一点。

请注意这里的关键运算符是您正在并行化 cpu-heavy 处理。网络请求部分本身已经非常有效地并行化了。