更多用法参考官方文档:http://nodejs.cn/api/worker_threads.html#worker_threads_worker_parentport
封装批量创建多线程的方法【推荐使用】
const { Worker, isMainThread, threadId } = require("worker_threads");
const GlobalArrayObject = require("../lib/global/GlobalArrayObject.js");
const GlobalUtils = require("./global/GlobalUtils.js");
async function test(thread_name, seconds) {
while (true) {
await GlobalUtils.deplayAsync(seconds, `延迟${seconds}秒,等待中...`);
console.log(`${thread_name}线程执行中...`);
}
}
console.log("执行了...");
class ownThread {
static async createThreads(threadJobFuncArray, filepath) {
/**
* 功能:封装批量创建线程的方法
* 参数:
* threadJobFuncArray:传入单个线程调用的方法
* 关于多线程worker_threads库的总结:
* 1、建议局部创建worker = new Worker(__filename)线程实例,因为每次创建都会执行文件__filename一次
* 2、如果局部想创建多少个线程,则必须在每一个单独的线程内部创建一个worker实例,确保改变threadId后重新执行一次整个文件__filename,
* 只有从头开始执行一次__filename文件才会识别threadId为多少,执行下一个线程
* 3、关于主线程isMainThread为True,其实等价于threadId===0,最开始默认线程id为0【然后每新创建一次worker线程id自动加1】
*/
GlobalArrayObject.checkIsArrayType([threadJobFuncArray]);
if (isMainThread || threadId < threadJobFuncArray.length) {
let worker = new Worker(filepath);
while (true) {
console.log(`正在执行线程threadId=${threadId}的方法!!!`);
await threadJobFuncArray[threadId]();
await GlobalUtils.deplayAsync(1000);
}
}
}
}
(async () => {
await ownThread.createThreads([async () => {
await test("main", 5000);
}, async () => {
await test("child001", 1000);
}, async () => {
await test("child002", 2000);
}, async () => {
await test("child003", 3000);
}], __filename);
})();
以下最原始的代码:创建了三个线程,仅自动跑,线程之间不传任何消息的情况【提供参考】
const GlobalUtils = require("./lib/global/GlobalUtils.js");
async function test(thread_name, seconds) {
while (true) {
await GlobalUtils.deplayAsync(seconds, `延迟${seconds}秒`);
console.log(`${thread_name}线程执行中...`);
}
}
const { Worker, isMainThread, threadId } = require("worker_threads");
// 每创建一次worker实例,都会扫码整个__filename文件一次
console.log("会执行吗?");
async function createThread() {
console.log("threadId=", threadId);
let worker = null;
if (isMainThread) {
worker = new Worker(__filename);
await test("main", 3000);
} else if (threadId === 1) {
worker = new Worker(__filename);
await test("001", 1000);
} else if (threadId === 2) {
worker = new Worker(__filename);
await test("002", 1000);
}
}