有没有办法让一个过程发现它在 Erlang 中是孤儿的?



例如

make_orphan() ->
  P = spawn(...),
  ok
.

有没有办法让p在make_orphan返回一段时间后接收消息?还是P注定会永远困扰这个系统(耗尽宝贵的资源),除非它自己退出?

一种简单的方法:

在make_orphan返回后一段时间接收消息

带有监视器。

make_orphan() ->
  Parent = self(),
  P = spawn(fun() -> monitor(process, Parent), ... end),
  ok

当Parent去世时,p将得到一条{'DOWN', Ref, process, Parent, Reason}消息。即使Parent在调用monitor/2之前退出,消息也会包含原因noproc

将p与某个进程通信,以某种方式注册p(注册、全局、gproc、pg2、一些自制解决方案等),让人监控它,等等。但是OTP程序的一个基本原则是每个进程都属于某个地方的监督树,所以这就不那么成问题了。

除非你正在建模一个远远超出OTP假设的系统(比如细胞自动机中的对等监督),否则你永远不想为孤儿的存在创造机会。孤立进程相当于内存泄漏的Erlang,这从来都不是一件好事。

有关编写OTP流程与原始Erlang相比更容易泄露流程的一些影响的背景信息,请阅读proc_lib的文档和OTP设计原则文档的"Sys和Proc_Lib"一章。

最新更新