【问题标题】:What's the best erlang approach to being able to identify a processes identity from its process id?能够从进程 ID 识别进程身份的最佳 erlang 方法是什么?
【发布时间】:2012-08-05 01:44:08
【问题描述】:

当我调试时,我通常会查看大约 5000 个进程,每个进程可能是大约 100 个 gen_servers、fsms 等中的一个。如果我想知道 erlang 进程是什么,我可以这样做:

process_info(pid(0,1,0), initial_call).

并得到如下结果:

{initial_call,{proc_lib,init_p,5}}

...这几乎是无用的。

最近,我萌生了一个想法(振作起来),为每个进程注册一个名称,该名称告诉我该进程所代表的身份。例如,player_1150 是代表玩家 1150 的玩家进程。是的,我最终在一周的运行过程中生成了几百万个原子。 (当我的系统在未使用大约 8GB 实际内存的情况下运行时,我很想听听 cmets 将限制提高到 10,000,000 个原子的缺点,如果有的话。)这样做意味着我可以在实时系统的控制台上,查询所有进程的消息队列有多长时间,找到最严重的违规者,然后检查这些进程是否已注册并打印出它们注册的原子。

我遇到了一个问题:我正在将进程从一个节点移动到另一个节点。现在一个玩家进程可以有3个不同的名字; player_1158、player_1158_deprecating、player_1158_replacement。而且我必须确保我以精确的时间注册和取消注册这些名称,以确保始终命名一个进程并且始终存在适当的名称,并且我不会尝试注册某个垂死的进程已经拥有的名称.有一些空间,因为这仅用于实时系统的控制台调试尽管如此,当我开始感觉这种机制正在影响我开发系统的方式(移动进程的系统)的那一刻,我觉得是时候了做点别的。

我现在有两个想法。将进程 ID 与其描述相关联的 ets 表:

ets:insert(self(), {player, 1158}).

我不太喜欢那个,因为我必须手动保持桌子清洁。当玩家退出(或崩溃)时,有人负责确保将他的数据从 ets 表中删除。

第二种选择是使用进程字典,存储类似的信息。当我对实时系统的探索让我想知道一个进程是谁时,我可以使用 process_info 查看他的进程字典。

我意识到这些解决方案中没有一个在功能上是干净的,但考虑到系统本身从来都不是这些数据的消费者,我并不太担心。我需要某些调试工具来快速轻松地工作,因此所描述的行为不值得商榷。是否有任何令人信服的论点可以采取某种方式(除了学术上的“不要使用_,这是邪恶的”罐头垃圾?)我很高兴听到其他建议及其理由.

【问题讨论】:

  • 小心动态生成的原子。如果你生成像 player_ 这样的 atom,你最终会用完 atom,因为 VM 从不“垃圾收集”它们。

标签: debugging erlang process ets process-dictionary


【解决方案1】:

你应该试试gproc,这是一个非常方便的保存进程元数据的应用程序。

一个进程可以用多个名称注册,您可以将任意属性关联到一个进程(其中键和值可以是任何 erlang 术语)。 gproc 还会监控已注册的进程,并在它们崩溃时自动取消注册。

【讨论】:

【解决方案2】:

如果您在gen_servers 和gen_fsms 仍在运行时对其进行调试,我将为这些行为实现handle_info 函数。当您向每个进程发送{get_info, ReplyPid} 元组时,相关进程可以发回描述其自身状态、状态等的术语。这样您就不必在进程本身之外跟踪这些信息。


Isac 提到已经有a built in way to do this

【讨论】:

  • 你也可以使用这个来获取进程的状态:stackoverflow.com/questions/4254070/…
  • 我没有意识到这样的事情存在,感谢您指出这一点。
  • 使用注册表命名进程的动机之一是使用 handle_info 或 handle_cast 作为检索此信息的机制,我将无法查询任何积压消息或等待消息(我在这个系统中没有这样做,但这是一个潜在的问题。由于我偶尔需要调试消息队列中充满垃圾的进程,因此取消了按需方法。
猜你喜欢
  • 2012-01-27
  • 1970-01-01
  • 2018-05-31
  • 2012-03-02
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多