mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
多worker共享事件(不稳定
This commit is contained in:
1 parent
d59710ddf1
commit
dd5a212422
9 files changed
+113
-20
No files matched your search
+45
-8
@@ -1,15 +1,52 @@
|
||||
const { EventEmitter } = require('events');
|
||||
const cluster = require('cluster');
|
||||
|
||||
const bus = new EventEmitter();
|
||||
|
||||
global.Hydro.service.bus = module.exports = {
|
||||
subscribe(events, handler) {
|
||||
function subscribe(events, handler, funcName) {
|
||||
if (!funcName) {
|
||||
for (const event of events) bus.on(event, handler);
|
||||
},
|
||||
unsubscribe(events, handler) {
|
||||
} else {
|
||||
handler.__bus = (...args) => {
|
||||
handler[funcName].call(handler, ...args);
|
||||
};
|
||||
for (const event of events) bus.on(event, handler.__bus);
|
||||
}
|
||||
}
|
||||
|
||||
function unsubscribe(events, handler, funcName) {
|
||||
if (!funcName) {
|
||||
for (const event of events) bus.off(event, handler);
|
||||
},
|
||||
publish(event, data) {
|
||||
bus.emit(event, { value: data, event });
|
||||
},
|
||||
} else {
|
||||
handler.__bus = (...args) => {
|
||||
handler[funcName].call(handler, ...args);
|
||||
};
|
||||
for (const event of events) bus.off(event, handler.__bus);
|
||||
delete handler.__bus;
|
||||
}
|
||||
}
|
||||
|
||||
function publish(event, data, isMaster = true) {
|
||||
bus.emit(event, { value: data, event });
|
||||
if (isMaster && global.Hydro.model.task) {
|
||||
global.Hydro.model.task.add({
|
||||
type: 'bus',
|
||||
count: Object.keys(cluster.workers).length,
|
||||
sender: cluster.worker.id,
|
||||
event,
|
||||
data,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function postInit() {
|
||||
const { task } = global.Hydro.model;
|
||||
task.consume({ type: 'bus' }, (data) => {
|
||||
if (data.sender === cluster.worker.id) return;
|
||||
publish(data.event, data.value, false);
|
||||
});
|
||||
}
|
||||
|
||||
global.Hydro.service.bus = module.exports = {
|
||||
subscribe, unsubscribe, publish, postInit,
|
||||
};
|
||||
Reference in new issue
Block a user