当我调试时,我通常会查看大约5000个进程,每个进程可能是大约100个gen_servers,fsms等之一.如果我想知道erlang进程是什么,我可以这样做:
process_info(pid(0,1,0), initial_call).
Run Code Online (Sandbox Code Playgroud)
并获得如下结果:
{initial_call,{proc_lib,init_p,5}}
Run Code Online (Sandbox Code Playgroud)
......这几乎没用.
最近,我想到了一个想法(支持你自己)注册每个过程的名称告诉我世卫组织所代表的过程.例如,player_1150是代表玩家1150的玩家进程.是的,我在一周的运行过程中最终制造了几百万个原子.(我希望听到关于在我的系统运行时使用大约8GB未使用的实际内存时限制为10,000,000个原子的缺点的评论,如果有的话.)这样做意味着我可以在实时系统的控制台上运行,查询所有进程的消息队列有多长,查找最高级别的违规者,然后检查这些进程是否已注册并打印出他们注册的原子.
我遇到了这个问题:我正在将进程从一个节点移动到另一个节点.现在玩家进程可以有3个不同的名字; player_1158,player_1158_deprecating,player_1158_replacement.我必须绝对确保我使用精确计时注册和注销这些名称,以确保始终命名一个进程并且始终存在相应的名称,并且我不会尝试注册某个死亡进程已经存在的名称.有一些slop空间,因为这只用于实时系统的控制台调试尽管如此,我开始感觉这个机制的那一刻影响了我如何开发系统(移动进程的那个)我觉得是时候到了做点别的.
我现在面前有两个想法.将流程ID与其描述相关联的ets表:
ets:insert(self(), {player, 1158}).
Run Code Online (Sandbox Code Playgroud)
我真的不喜欢那个,因为我必须手动保持桌子清洁.当玩家退出(或崩溃)时,有人负责确保他的数据从ets表中删除.
第二种方法是使用进程字典,存储类似的信息.当我对实时系统的探索让我想知道一个进程是谁时,我可以使用process_info查看他的进程字典.
我意识到这些解决方案都没有在功能上干净,但考虑到系统本身永远不会,这些数据的消费者,我不会太担心它.我需要某些调试工具才能快速轻松地工作,因此所描述的行为不容争论.是否有任何令人信服的论据可以采用这种或那种方式(除了学术界"不使用_,它是邪恶的"罐装垃圾?)我很乐意听到其他建议及其理由.