首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spawn_link不工作吗?

spawn_link不工作吗?
EN

Stack Overflow用户
提问于 2012-10-22 08:56:15
回答 2查看 1.2K关注 0票数 2

我正在使用spawn_link,但不了解它的行为。考虑以下代码:

代码语言:javascript
复制
-module(test).
-export([try_spawn_link/0]).

try_spawn_link() ->
  spawn(fun() ->
    io:format("parent: ~p~n", [Parent = self()]),
    Client = spawn_link(fun() ->
      io:format("child: ~p~n", [self()]),
      spawn_link_loop(Parent)
    end),
    spawn_link_loop(Client)
  end).

spawn_link_loop(Peer) ->
  receive
    quit ->
      exit(normal);
    Any ->
      io:format("~p receives ~p~n", [self(), Any])
  end,
  spawn_link_loop(Peer).

Erlang文献中,原子地在调用进程和新进程之间创建了一个链接。但是,我进行了如下测试,没有注意到链接的效果。

代码语言:javascript
复制
1> test:try_spawn_link().
parent: <0.34.0>
<0.34.0>
child: <0.35.0>
2> is_process_alive(pid(0,34,0)).
true
3> is_process_alive(pid(0,35,0)).
true
4> pid(0,35,0) ! quit.
quit
5> is_process_alive(pid(0,35,0)).
false
6> is_process_alive(pid(0,34,0)).
true

1> test:try_spawn_link().
parent: <0.34.0>
<0.34.0>
child: <0.35.0>
2> is_process_alive(pid(0,34,0)).
true
3> is_process_alive(pid(0,35,0)).
true
4> pid(0,34,0) ! quit.
quit
5> is_process_alive(pid(0,35,0)).
true
6> is_process_alive(pid(0,34,0)).
false

据我理解,如果链接的一个对等点退出,则另一个对等点退出(或被通知退出)。但结果似乎与我的理解不同。

编辑:感谢牛肝菌Pascal的回答。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-22 09:15:05

正如Erlang参考手册中的过程一章的“错误处理”部分所描述的,只有当退出原因不是normal时,链接进程退出才会导致其链接进程退出。这就是OTP广泛使用shutdown退出原因的原因。

票数 4
EN

Stack Overflow用户

发布于 2012-10-22 09:14:56

这是因为您选择了使用exit(normal)。在这种情况下,另一个进程将不会停止。例如,如果您使用exit(killed),那么您将得到您期望的行为。

您可以使用监视器获得有关正常终止的信息。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13007890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档