【问题标题】:How Do You Determine The PID of the Parent of a Process如何确定进程父进程的 PID
【发布时间】:2010-09-05 11:31:12
【问题描述】:

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

【问题讨论】:

标签: erlang


【解决方案1】:

最好的方法肯定是将它作为参数传递给调用的函数以启动子进程。如果您正在产生乐趣,这通常是一件好事,请小心这样做:

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

这不会按您的预期进行。 (提示:self() 何时被调用)

通常你应该避免注册一个进程,即给它一个全局名称,除非你真的希望它是全局已知的。生成一个有趣的函数意味着您不必导出生成的函数,因为您通常应该避免导出不打算从其他模块调用的函数。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      FUNC() ->

      %% 做点什么
      %% 然后发送消息给父母
      家长!消息。

      ...

      注册(父母,自我()),
      生成(模块,功能,[ARGS])。

      请参阅 Getting Started With Erlang §3.3The Erlang Reference Manual §10.3

      【讨论】:

      • 虽然你可以通过注册一个名字来做到这一点,但这根本不是一个好主意。如果您积极劝阻并解释问题,这篇文章会更好。
      • 回到私人测试版(这个问题可以追溯到私人测试版开始后大约一周),该网站的讨论方面并不是非常好的。我真的不想发表意见,只是陈述一种替代方法。我认为其他答案/帖子中已充分解决了利弊。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-09-16
        • 2021-06-24
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 2014-06-25
        相关资源
        最近更新 更多