我们如何确定流程父级的PID

时间:2020-03-05 18:38:13  来源:igfitidea点击:

我在erlang中有一个进程,应该在产卵后立即执行某些操作,然后在完成后将结果发送回父进程。我如何找出产生它的过程的PID?

解决方案

回答

我们应该将self()作为入口函数的参数之一传递给孩子。

spawn_link(?MODULE, child, [self()]).

回答

我们可以使用BIF寄存器为生成/父进程指定一个名称(原子),然后从其他进程中引用回已注册的名称。

FUNC() ->
  
  
    %% Do something

    %% Then send message to parent

    parent ! MESSAGE.

...

注册(父母,self()),
生成(MODULE,FUNC,[ARGS])。

请参阅《 Erlang 3.3入门》和《 Erlang参考手册》 10.3.

回答

@Eridius的答案是首选方法。要求一个过程来注册一个名称可能会产生意想不到的副作用,例如增加过程的可见性,更不用说当我们有很多过程时要提出唯一名称的麻烦。

回答

最好的方法肯定是将其作为参数传递给启动子进程的函数。如果我们要产生乐趣,通常这是一件好事,请注意以下事项:

spawn_link(fun () -> child(self()) end)

这不会达到预期。 (提示:何时调用self())

通常,除非我们确实希望它是全球知名的,否则应该避免注册一个进程,即为它指定一个全局名称。产生乐趣意味着我们不必导出生成的函数,因为通常应避免导出本来不是要从其他模块调用的函数。