当我需要创建一个进程时,我将使用习惯的spawn bif.But还有一个bif spawn_link,通常用于做同样的事情.
所以基本上什么时候应该使用spawn和spawn_link?
zxq*_*xq9 13
在操作中手动执行spawn然后link手动操作相同spawn_link,但在时间上不等效; 特别是它不是原子的(如在两个独立的操作中,而不是单个的,不可分割的操作).如果您生成一个进程并且它在初始化时死亡(无论您start或init函数是什么),那么它可能会在link完成调用之前死亡,并且链接进程将永远不会收到通知,因为该进程在链接之前已经死亡.哎呀!
来自Joe Armstrong的编程Erlang第 13章"为什么产卵和链接必须是原子操作":
曾几何时,Erlang有两个原语,
spawn并且link,spawn_link(Mod, Func, Args)定义如下:
spawn_link(Mod, Func, Args) ->
Pid = spawn(Mod, Func, Args),
link(Pid),
Pid.
Run Code Online (Sandbox Code Playgroud)
然后发生了一个不起眼的错误.生成的进程在调用link语句之前就已经死了,因此进程死了,但没有生成错误信号.这个bug需要很长时间才能找到.为了解决这个问题,将
spawn_link其添加为原子操作.当涉及并发时,即使看起来简单的程序也会很棘手.
| 归档时间: |
|
| 查看次数: |
4455 次 |
| 最近记录: |