问题标签 [process-dictionary]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
debugging - 能够从进程 ID 识别进程身份的最佳 erlang 方法是什么?
当我调试时,我通常会查看大约 5000 个进程,每个进程可能是大约 100 个 gen_servers、fsms 等中的一个。如果我想知道 erlang 进程是什么,我可以这样做:
并得到如下结果:
...这几乎是无用的。
最近,我想到了一个想法(振作起来),用一个名字来注册每个进程,这个名字告诉我这个进程代表了谁。例如,player_1150 是代表玩家 1150 的玩家进程。是的,我最终在一周的运行过程中生成了几百万个原子。(当我的系统在未使用大约 8GB 的实际内存的情况下运行时,我很想听到关于将限制提高到 10,000,000 个原子的缺点的评论,如果有的话。)这样做意味着我可以在实时系统的控制台上,查询所有进程的消息队列有多长时间,找到最严重的违规者,然后检查这些进程是否已注册并打印出它们注册的原子。
我遇到了一个障碍:我正在将进程从一个节点移动到另一个节点。现在一个玩家进程可以有3个不同的名字;player_1158、player_1158_deprecating、player_1158_replacement。而且我必须确保我以精确的时间注册和取消注册这些名称,以确保始终命名一个进程并且始终存在适当的名称,并且我不会尝试注册某个垂死的进程已经拥有的名称. 有一些空间,因为这仅用于实时系统的控制台调试尽管如此,当我开始感觉这种机制正在影响我开发系统的方式(移动进程的系统)的那一刻,我觉得是时候了做点别的。
我现在有两个想法。将进程 ID 与其描述相关联的 ets 表:
我不太喜欢那个,因为我必须手动保持桌子清洁。当玩家退出(或崩溃)时,有人负责确保从 ets 表中删除他的数据。
第二种选择是使用进程字典,存储类似的信息。当我对实时系统的探索让我想知道进程是谁时,我可以使用 process_info 查看他的进程字典。
我意识到这些解决方案中没有一个在功能上是干净的,但鉴于系统本身从来都不是这些数据的消费者,我并不太担心。我需要某些调试工具来快速轻松地工作,因此所描述的行为不值得商榷。是否有任何令人信服的论点可以采用这种或另一种方式(除了学术上的“不要使用_,这是邪恶的”罐头垃圾?)我很乐意听到其他建议和他们的理由。
erlang - 如果我删除了 gen_server 模块的进程字典会怎样?
我正在使用 gen_server 模块中的进程字典,我调用了 get() 函数,我得到了类似的东西。
如果我删除进程字典会发生什么,会出现什么问题?
我删除了它,一切正常,即使调用在 child_server 中生成异常的函数 main_server 仍然可以获得退出信号。