为了账号安全,请及时绑定邮箱和手机立即绑定

全局数据对象

全局数据对象

30秒到达战场 2022-08-04 17:19:58
从第二个文件加载数据对象时,该对象为空。有没有办法获取所有文件上的对象子级?索引.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

哪种方法最适合您取决于您实际需要此全局存储的原因。我个人会推荐像redismemcached这样的东西,但你也可以考虑自己编写一个IPC驱动程序来获取你正在寻找的任何信息。分别查找主进程和工作线程的 subprocess.send 和 process.send

我不建议的绝对最后手段是让你的主进程在修改文件时将文件写入磁盘,并在每次需要获取一些信息时让工作进程从磁盘读取。如果此全局对象将被高度使用(不和谐机器人 - 这是全局成员缓存还是其他什么?),这是非常不可取的,因为您的I / O负载将很高并且容易损坏。请改用上面建议的解决方案之一。


查看完整回答
反对 回复 2022-08-04
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信