【发布时间】:2022-01-06 02:41:04
【问题描述】:
我有一个nodejs cluster,其主节点处理工作循环(在 while 循环中)并监听工作消息以在循环中进行。 (在我的代码中 index.js 不会在 setInterval 上发送消息,而是在其他类型的事件上发送消息,我在这里简化了代码以了解问题的本质)
Server.js
var cluster = require('cluster');
const ClusterMessages = require('cluster-messages');
const messages = new ClusterMessages();
if (cluster.isMaster){
let worker = cluster.fork()
console.log(cluster);
(async ()=>{
let cycle = 0
while(true){
console.log(cycle);
cycle ++
await Promise.all([
enough(),
])
}
function enough () {
return new Promise(resolve => {
messages.on('enough', () => {
console.log('enough');
resolve()
});
});
}})()
} else {
require('./index.js')
}
Index.js
const ClusterMessages = require('cluster-messages');
const messages = new ClusterMessages();
setInterval(() => {
messages.send('enough');
}, 1000);
代码运行良好(因此,在本示例和我的代码中),但似乎存在内存泄漏,您可以从这段代码的输出中理解:
0
enough
1
enough
enough
2
enough
enough
enough
3
enough
enough
enough
enough...
我尝试了几件事,比如交换新的 Promise 和 messages.on(),在 Promise 的回调中添加一个 return,但我不知道这里发生了什么。有什么想法吗?
解决方法是,与 cluster-messages 包的“事件监听器”相反,再制作一个可以触发一次的事件
Server.js
if (cluster.isMaster){
let worker = cluster.fork()
console.log(cluster);
// Importing events
const EventEmitter = require('events');
const eventEmitter = new EventEmitter();
messages.on('enough', () => {
eventEmitter.emit('event');
});
(async ()=>{let cycle = 0
while(true){
console.log(cycle);
cycle ++
await Promise.all([
enough(),
])
}
function enough () {
return new Promise(resolve => {
eventEmitter.once('event', () => {
console.log('event');
resolve()
});
});
}})()
} else {
require('./index.js')
}
Index.js
const ClusterMessages = require('cluster-messages');
const messages = new ClusterMessages();
setInterval(() => {
messages.send('enough');
}, 1000);
【问题讨论】:
-
为什么要使用
while循环并承诺处理事件? -
我使用 while 是因为我需要循环运行未知次数我使用 Promise 是因为我不仅有足够的函数来解决问题,而且还有 3 个不同的函数,其中一个是超时(最短时间在进入循环的下一步之前等待)
标签: javascript node.js promise eventemitter