我不完全确定PID和参考之间的区别以及何时使用它。
如果我使用spawn/1
pid生成一个新进程。我可以用PID禁用它吗?我为什么需要参考?
同样地,我看到monitor/1
收到带有ref和pid号码的邮件。
谢谢!
答案 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),无论使用什么。