网络请求的并行化对 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 的一些用例是
- 创建 http_servers 的集群。
- 正在新线程上分配 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 处理。网络请求部分本身已经非常有效地并行化了。
我正在试验 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 的一些用例是
- 创建 http_servers 的集群。
- 正在新线程上分配 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 处理。网络请求部分本身已经非常有效地并行化了。