E.g。
make_orphan() ->
P = spawn(...),
ok
.
在make_orphan返回后,P有没有办法接收消息?或者P注定要永远困扰系统(耗尽宝贵的资源),除非它自己退出?
答案 0 :(得分:1)
直接的方式:
在make_orphan返回后的某个时间收到消息
带有monitor。
make_orphan() ->
Parent = self(),
P = spawn(fun() -> monitor(process, Parent), ... end),
ok
当父亲去世时,P会收到{'DOWN', Ref, process, Parent, Reason}
消息。即使家长在调用monitor/2
之前退出,该邮件也会包含原因noproc
。
答案 1 :(得分:0)
将P传递给某个地方的某个进程,以某种方式注册P(注册,全局,gproc,pg2,某些自制解决方案等),有人监控它等等。当然,有几种方法。但是OTP程序的一个基本原则是每个进程都属于某个监督树,所以这不再是一个问题。
除非你正在建立一个超出OTP假设的系统(如细胞自动机中的同伴监督),否则你不想创造孤儿存在的机会。孤立进程是Erlang等同于内存泄漏 - 这绝不是一件好事。
有关编写OTP进程与原始Erlang内容的一些影响的一些背景信息,您更有可能泄漏进程,请阅读the documentation for proc_lib
和the "Sys and Proc_Lib" chapter the OTP Design Principles docs }。