题
我在 erlang 中有一个进程,应该在生成后立即执行某些操作,然后在完成时将结果发送回父级。如何找出生成它的进程的 PID?
解决方案
您应该将 self() 作为入口函数的参数之一传递给子级。
spawn_link(?MODULE, child, [self()]).
其他提示
@Eridius' 的答案是首选的方法。要求进程注册名称可能会产生意想不到的副作用,例如增加进程的可见性,更不用说当您有很多进程时提出唯一名称的麻烦。
最好的方法肯定是将其作为参数传递给调用以启动子进程的函数。如果您正在产生乐趣(这通常是一件好事),请小心执行以下操作:
spawn_link(fun () -> child(self()) end)
这不会如你所愿。(暗示:self() 何时被调用)
一般来说,您应该避免注册进程,即给它起一个全球性的名字,除非你真的想让它全球闻名。生成一个 fun 意味着您不必导出生成的函数,因为您通常应该避免导出不打算从其他模块调用的函数。
您可以使用 BIF 寄存器为生成/父进程指定一个名称(原子),然后引用其他进程的注册名称。
功能()->
%% 做一点事
%% 然后发送消息给家长
家长!信息。...
注册(父级,自我()),
产卵(模块,功能,[ARGS])。
不隶属于 StackOverflow