@eggjs/cluster
Version:
cluster manager for egg
79 lines (77 loc) • 2.21 kB
JavaScript
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 };