UNPKG

@eggjs/cluster

Version:

cluster manager for egg

79 lines (77 loc) 2.21 kB
import { BaseAgentUtils, BaseAgentWorker } from "../../base/agent.js"; import { ClusterAgentWorkerError } from "../../../../error/ClusterAgentWorkerError.js"; import workerThreads from "node:worker_threads"; import "graceful-process"; //#region src/utils/mode/impl/worker_threads/agent.ts var AgentThreadWorker = class extends BaseAgentWorker { get workerId() { return this.instance.threadId; } send(message) { this.instance.postMessage(message); } static send(message) { message.senderWorkerId = String(workerThreads.threadId); workerThreads.parentPort.postMessage(message); } static kill() { process.exit(1); } static gracefulExit(options) { const { beforeExit } = options; process.on("exit", async (code) => { if (typeof beforeExit === "function") await beforeExit(); process.exit(code); }); } }; var AgentThreadUtils = class extends BaseAgentUtils { #worker; #id = 0; instance; fork() { this.startTime = Date.now(); const argv = [JSON.stringify(this.options)]; const agentPath = this.getAgentWorkerFile(); const worker = this.#worker = new workerThreads.Worker(agentPath, { argv }); const agentWorker = this.instance = new AgentThreadWorker(worker); this.emit("agent_forked", agentWorker); agentWorker.status = "starting"; agentWorker.id = ++this.#id; this.log("[master] agent_worker#%s:%s start with worker_threads", agentWorker.id, agentWorker.workerId); worker.on("message", (msg) => { if (typeof msg === "string") msg = { action: msg, data: msg }; msg.from = "agent"; this.messenger.send(msg); }); worker.on("error", (err) => { this.logger.error(new ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err)); }); worker.once("exit", (code, signal) => { this.messenger.send({ action: "agent-exit", data: { code, signal }, to: "master", from: "agent" }); }); } clean() { this.#worker.removeAllListeners(); } async kill() { if (this.#worker) { this.log(`[master] kill agent worker#${this.#id} (worker_threads) by worker.terminate()`); this.clean(); await this.#worker.terminate(); } } }; //#endregion export { AgentThreadUtils };