egg.js 中的子进程会多次执行

405 阅读1分钟

由于 Egg.js 是支持多进程的,在启动的时候会根据当前的CPU的核数来创建 worker

那就会有多个worker的情况,这样就会导致子进程在每个worker中都会执行。

会导致不同的worker操作同一个数据的情况

可以用 Egg.js 中的 Agent 机制,来避免多次执行

image.png

或者使用 Node.js 中的 Cluster 来判断子进程,以便来确认子进程要在哪个worker中执行

const { fork } = require('child_process');
if (cluster.isWorker && cluster.worker.id === 1) { 
    const child = fork('path/to/child.js'); // ... 
}

设置启动 worker 数量

一般 worker 的数量和 CPU 核数相关,有几核,就有几个 worker。开发环境一般不需要设置,只有在正式环境遇到了问题,开发环境需要复现问题时,用到。

方式一

config.default.ts 文件中加上

config.cluster = {
    workers: 2,
};

方式二

package.json"scripts" 中加一个启动

"set-worker": "egg-bin dev --workers=4"

然后直接 npm run set-worker 就可以了

方式三

直接命令行执行

egg-bin dev --workers=4

egg-scripts start --daemon --workers=4

相关文档 Cluster | Node.js v14.21.3 Documentation (nodejs.org)