有没有办法创建线程以同时运行多个方法?
这样,如果任何一个方法在中途失败,则应该杀死所有其他线程。
有没有办法创建线程以同时运行多个方法?
这样,如果任何一个方法在中途失败,则应该杀死所有其他线程。
同时,Node.js中至少有一个用于实现本地线程的库:node-webworker-threads。
https://github.com/audreyt/node-webworker-threads
这基本上是为node.js实现Web Worker浏览器API。更新2:
自Node.js 12 LTS的工作线程已经稳定。
更新1:
从Node v11.7.0开始,您无需使用--experimental-worker
标志。
发行说明:https://nodejs.org/en/blog/release/v11.7.0/
从Node 10.5开始支持多线程,但是它是实验性的。希望这很快就会变得稳定。
请查看以下资源:
require
引入模块,而我需要这个功能对于那些想知道我为什么需要真正的多线程的人:因为涉及到树莓派和中断的应用程序。一个线程处理这些中断,另一个线程负责存储数据(以及其他任务)。
nodejs 10.5.0版本发布,宣布在Node.js中引入了多线程。 这个功能仍处于实验阶段。现在有一个新的worker_threads模块可用。
如果您运行Node.js v10.5.0或更高版本,则可以开始使用工作线程,但这是一个实验性API。 它并不默认可用:您需要在调用Node.js时使用--experimental-worker进行启用。
以下是一个使用ES6和启用worker_threads的示例,在版本12.3.1上测试通过。
//package.json
"scripts": {
"start": "node --experimental-modules --experimental- worker index.mjs"
},
现在,您需要从worker_threads中导入Worker。注意:为了支持ES6,您需要使用'.mjs'扩展名声明您的js文件。
//index.mjs
import { Worker } from 'worker_threads';
const spawnWorker = workerData => {
return new Promise((resolve, reject) => {
const worker = new Worker('./workerService.mjs', { workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', code => code !== 0 && reject(new Error(`Worker stopped with
exit code ${code}`)));
})
}
const spawnWorkers = () => {
for (let t = 1; t <= 5; t++)
spawnWorker('Hello').then(data => console.log(data));
}
spawnWorkers();
//workerService.mjs
import { workerData, parentPort, threadId } from 'worker_threads';
// You can do any cpu intensive tasks here, in a synchronous way
// without blocking the "main thread"
parentPort.postMessage(`${workerData} from worker ${threadId}`);
输出:
运行 npm start
Hello from worker 4
Hello from worker 3
Hello from worker 1
Hello from worker 2
Hello from worker 5
你可能正在寻找Promise.race
(本地I/O竞速解决方案,而非线程)
假设你(或其他搜索此问题的人)想要比赛线程以避免失败并避免I/O操作的成本,这是一种简单且本地的方法来实现它(不使用线程)。Node旨在是单线程的(查找事件循环),因此尽可能避免使用线程。如果我的假设是正确的,我建议你使用Promise.race
和setTimeout
(链接中有示例)。使用此策略,您将比赛一系列承诺,每个承诺都尝试执行某些I/O操作,并在出现错误时拒绝该承诺(否则超时)。Promise.race
语句在第一个解析/拒绝后继续执行,这似乎是您想要的。希望这能帮助到某些人!