gpt4 book ai didi

node.js - 如何在nodejs中使用多线程或多进程

转载 作者:行者123 更新时间:2023-12-03 12:58:46 27 4
gpt4 key购买 nike

我如何在多线程中运行 Node 服务器。让我先从我的场景开始。我有 2 个文件,一个是 server.js,另一个是 process.js 现在我的要求是如何在其他共享线程(如集群)中运行 process.js。 注意:- 集群在我的场景中不起作用。我想要其他与集群相同的东西所以我的问题是 child_process.folk 或 spawn 是否与集群相同???或者我如何在不使用集群的情况下在 Node 中实现多线程。此外,我浏览了子进程文档,但并没有消除我的疑问。请原谅我的愚蠢问题

最佳答案

如果 process.js 处理的工作性质是 CPU 密集型,您可以使用工作线程 API。由于您不想使用集群模块,工作线程可能很有用。事实上,推荐的处理 CPU 密集型工作的方法。

集群模块使用child_process.fork 创建子进程。

a special case of the spawn() functionality for spawning Node processes. In addition to having all the methods in a normal ChildProcess instance, the returned object has a communication channel built-in. read here more https://nodejs.org/api/cluster.html#cluster_how_it_works.

工作线程的特别之处:

  • ArrayBuffers 将内存从一个线程传输到另一个线程。
  • SharedArrayBuffer 可从任一线程访问。它允许您在线程之间共享内存(限于二进制数据)。
  • Atomics 可用,它可以让您更高效地并发执行一些过程,并允许您在 JavaScript 中实现条件变量。

  • MessagePort,用于不同线程之间的通信。它可用于在不同的 Worker 之间传输结构化数据、内存区域和其他 MessagePort。

  • MessageChannel 表示用于不同线程之间通信的异步双向通信 channel 。
  • WorkerData 用于传递启动数据。一个任意的 JavaScript 值,其中包含传递给该线程的 Worker 构造函数的数据的克隆。就像使用 postMessage()
  • 一样克隆数据

工作线程的一个例子Main.js(在你的例子中是 server.js)

const { Worker } = require('worker_threads')

function runWorker() {

const worker = new Worker('./worker.js',{workerData:{i:0}});

worker.on('message',function(data){

console.log(data);

});

worker.on('error', function(error){

console.log(error)

});
worker.on('exit', (code) => {
if (code !== 0)
console.log(new Error(`Worker stopped with exit code ${code}`));
})
}


runWorker()

worker.js(在你的例子中是 process.js)

const { workerData, parentPort } = require('worker_threads')

/* You can do any heavy stuff here, in a synchronous way
without blocking the "main thread"*/

console.log(workerData)
let i=workerData.i
for(;i<500;i++){
parentPort.postMessage({I:i})

}

有助于入门的资源:

https://nodesource.com/blog/worker-threads-nodejs/

https://medium.com/@Trott/using-worker-threads-in-node-js-80494136dbb6

https://medium.com/nodejsmadeeasy/workers-threads-in-node-js-part2-ec45ac084963

关于node.js - 如何在nodejs中使用多线程或多进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60098884/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com