参考与pid?

时间:2014-11-19 19:47:30

标签: erlang

我不完全确定PID和参考之间的区别以及何时使用它。

如果我使用spawn/1 pid生成一个新进程。我可以用PID禁用它吗?我为什么需要参考?

同样地,我看到monitor/1收到带有ref和pid号码的邮件。

谢谢!

2 个答案:

答案 0 :(得分:27)

Pid 是进程标识符。当您使用spawn创建新流程时,您可以获得一个,或者您可以使用self()获得自己的Pid。它允许您与给定的流程进行交互。特别是Pid ! Message向其发送消息。还有一些其他的东西,比如明确地(不应该)杀死它或者用erlang:process_info获取一些过程信息。

您可以在erlang:link(Pid)erlang:monitor(process, Pid)进程之间创建关系(在Pid进程和进程执行此函数之间)。简而言之,当另一个进程死亡时,它会为您提供“通知”。

参考只是almost unique值(不同类型)。有人可能会说,它为你提供了一些现在和现在的参考,你可以在以后认识到这一点。例如,如果我们向另一个进程发送消息,并且我们期望得到响应,我们希望确保我们将收到的消息与我们的请求相关联,而不仅仅是来自其他人的任何消息。最简单的方法是使用唯一值标记消息,并等待具有完全相同标记的响应。

  Tag = make_ref(),
  Pid ! {Tag, Message},
  receive 
     {Tag, Response} ->
         ....

在此代码中,使用模式匹配,我们确保(我们等待接收直到)Response完全适用于我们发送的Message。无论来自其他进程的其他消息。这是您可以遇到的最常见的参考用途。

现在回到monitor。在致电Ref = monitor(process, Pid)时,我们会与Pid进程建立此特殊连接。返回的Ref只是一些唯一的引用,我们可以用demonitor这个过程。就是这样。

有人可能会问,如果我们能够使用Pid创建监视器,为什么我们需要Ref进行恶魔监控?我们不能再次使用Pid了。理论上我们可以,但监视器以这样的方式实现,可以在两个相同的进程之间建立多个监视器。因此,在进行恶魔控制时,我们必须只删除其中一个这样的连接。它以这种方式完成,使监控更加透明。如果你有创建和删除一个监视器的函数库,你不会想要干扰他们可能正在使用的其他库和函数以及监视器。

答案 1 :(得分:3)

根据this page

  

引用是具有两个属性的erlang对象:

They can be created by a program (using make_ref/0), and,
They can be compared for equality.

只要您需要将唯一标识符绑定到某个“对象”,就应该使用它。任何时候您都可以使用erlang:make_ref/0生成新的。 Documentation说:

  

make_ref() - >参考()

     

返回一个几乎唯一的引用。

     

返回的引用将在大约2 ^ 82次调用后重新发生;   因此它具有足够的实用性。

当您调用erlang:monitor/2函数时,它会返回您的引用,以便您可以取消监视器(erlang:demonitor/1函数)。此引用仅标识erlang:monitor/1的某些调用。如果您需要使用进程(例如,杀死它),您仍然必须使用进程pid。

  
    

同样地,我看到monitor / 1收到带有ref和pid号码的消息。

  

是的,监视器会发送{'DOWN',Ref,process,Pid,Reason}等消息。使用什么(pid或ref)仅取决于你的应用程序逻辑,但在大多数情况下(IMO),无论使用什么。