Erlang取消链接的进程终止

时间:2014-11-26 10:49:34

标签: erlang

如果我有一个进程A调用进程B中的函数(procB:func()。),并且func()在执行期间生成错误。流程B将终止,但流程A呢?在流程A中考虑以下内容:

案例1:

 {ok, Reply} = procB:func().

案例2:

 procB:func().

在两种情况下,进程A都会终止吗?或者只是因为不匹配的情况1?请注意,这两个流程没有关联。

提前致谢!

2 个答案:

答案 0 :(得分:2)

没有在另一个进程中调用函数的事情,你可以向进程发送一条消息,然后它可以根据消息内容选择调用函数。

gen_servers以这种方式工作,你向gen_server发送一条消息,它对消息进行匹配,并选择是否应该调用call / cast / info / terminate函数。

假设您真的在谈论从A到B发送消息而B决定退出,那就是过程A是否链接/监控过程B。

如果您监控B,则会向您发送一条消息,说明B已关闭,原因如此。 如果你与B联系在一起,我相信如果B死亡的状态不是“正常”,那么你就会被杀死

A也可以设置标志trap_exit,这意味着即使链接和B死亡,A也会发送一条消息,告诉他应该死,然后你可以与该消息进行交互(即:你可以重启B,如果你选择的话)

learn you some erlang有一个关于它是如何工作的好教程。

答案 1 :(得分:1)

您无法在其他进程中调用函数。这就是Erlang的魅力:进程之间的所有通信都是通过消息传递进行的。人们有时会将模块与流程混淆。我甚至写了article about it

例如流程A:

  • 产生过程B
  • 发送消息,例如元组{fun_to_call, Args, self()}(您需要self()知道,在哪里回复
  • 使用receive
  • 等待回复

流程B:

  • 在开始等待消息后立即
  • 收到消息时,进行一些计算并发回响应

这看起来像很多样板文件,因此这个确切的模式在gen_server

中被抽象出来