【发布时间】:2010-09-05 11:31:12
【问题描述】:
我在 erlang 中有一个进程,它应该在生成后立即执行某些操作,然后在完成后将结果发送回父级。如何找出产生它的进程的 PID?
【问题讨论】:
-
对于使用
proc_lib的OTP和其他进程,请参阅How to find the supervisor of an OTP process?
标签: erlang
我在 erlang 中有一个进程,它应该在生成后立即执行某些操作,然后在完成后将结果发送回父级。如何找出产生它的进程的 PID?
【问题讨论】:
proc_lib的OTP和其他进程,请参阅How to find the supervisor of an OTP process?
标签: erlang
最好的方法肯定是将它作为参数传递给调用的函数以启动子进程。如果您正在产生乐趣,这通常是一件好事,请小心这样做:
spawn_link(fun () -> child(self()) end)
这不会按您的预期进行。 (提示:self() 何时被调用)
通常你应该避免注册一个进程,即给它一个全局名称,除非你真的希望它是全局已知的。生成一个有趣的函数意味着您不必导出生成的函数,因为您通常应该避免导出不打算从其他模块调用的函数。
【讨论】:
@Eridius 的回答是首选方法。要求进程注册名称可能会产生意想不到的副作用,例如增加进程的可见性,更不用说在有很多进程时想出唯一名称的麻烦。
【讨论】:
您可以使用 BIF 寄存器为生成/父进程命名(一个原子),然后从其他进程中引用已注册的名称。
FUNC() ->
%% 做点什么
%% 然后发送消息给父母
家长!消息。...
注册(父母,自我()),
生成(模块,功能,[ARGS])。
请参阅 Getting Started With Erlang §3.3 和 The Erlang Reference Manual §10.3。
【讨论】:
您应该将 self() 作为入口函数的参数之一传递给孩子。
spawn_link(?MODULE, child, [self()]).
【讨论】: