从第二个文件加载数据对象时,该对象为空。有没有办法获取所有文件上的对象子级?索引.js:const {ShardingManager} = require('discord.js');require('dotenv').config();const chalk = require('chalk');const storage = require('./Modules/GlobalStorage');storage.setDataObject('test', 'test_value');console.log(chalk.yellow(`Shard Manager Data: ${JSON.stringify(storage.listDataObjects())}`));let shardManager = new ShardingManager('./Shard/index.js', { totalShards: 2, token: process.env.CLIENT_TOKEN});shardManager.spawn();shardManager.on('shardCreate', (shard) => { console.log(chalk.rgb(75,0,130)(`[SHARD] Created Shard (ID: ${shard.id})`));});模块/全局存储.js:let DataObject = {};exports.listDataObjects = () => { return DataObject;};exports.setDataObject = (key, property) => { DataObject[key] = property; if(DataObject[key]) return true;};exports.getDataObject = (key) => { return DataObject[key];};分片/索引.js:const {listDataObjects, getDataObject} = require("../Modules/GlobalStorage");console.log(chalk.yellow(`Shard Data: ${JSON.stringify(listDataObjects())}`));我标记discord.js的原因是这是我的discord bot,它是分片的,这是(我相信)问题。
1 回答
心有法竹
TA贡献1866条经验 获得超5个赞
生成的分片是不与主进程共享内存的新进程。它们无法访问相同的全局变量或任何其他变量 - 它们之间的唯一通信必须通过某些第三方(如磁盘上的文件或缓存服务器)或通过IPC(等)。process.send
哪种方法最适合您取决于您实际需要此全局存储的原因。我个人会推荐像redis或memcached这样的东西,但你也可以考虑自己编写一个IPC驱动程序来获取你正在寻找的任何信息。分别查找主进程和工作线程的 subprocess.send 和 process.send。
我不建议的绝对最后手段是让你的主进程在修改文件时将文件写入磁盘,并在每次需要获取一些信息时让工作进程从磁盘读取。如果此全局对象将被高度使用(不和谐机器人 - 这是全局成员缓存还是其他什么?),这是非常不可取的,因为您的I / O负载将很高并且容易损坏。请改用上面建议的解决方案之一。
添加回答
举报
0/150
提交
取消