最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

全局数据对象

网站源码admin17浏览0评论

全局数据对象

全局数据对象

从第二个文件加载数据对象时,该对象为空。有什么办法可以在所有文件上获得对象子级?

index.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})`));
});

Modules / GlobalStorage.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];
};

Shard / index.js:

const {listDataObjects, getDataObject} = require("../Modules/GlobalStorage");

console.log(chalk.yellow(`Shard Data: ${JSON.stringify(listDataObjects())}`));

我标记discord.js的原因是这是我的discord机器人,因此(我相信)这是问题所在。

回答如下:

产生的碎片是新进程,它不与主进程共享内存。它们不能访问相同的全局变量或任何其他变量-它们之间的唯一通信必须通过某个第三方(例如磁盘上的文件或缓存服务器)或通过IPC(process.send等)。

哪种方法最适合您,取决于您为什么实际需要此全局存储。我个人建议使用redis或memcached之类的东西,但您也可以考虑自己编写IPC驱动程序以获取所需的任何信息。分别查找master和worker的subprocess.send和process.send。

我不推荐的绝对不得已的方法是让您的主进程在文件修改后将其写入磁盘,并在每次需要获取某些信息时让工作进程从磁盘读取。如果将高度使用此全局对象(discord bot-这是全局成员缓存还是其他东西?),则不建议这样做,因为您的I / O负载很高且容易损坏。请使用上面建议的解决方案之一。

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论