使用Spawn和Spawn_link时?

时间:2014-09-29 06:06:50

标签: erlang

当我需要创建一个进程时,我将使用习惯的spawn bif.But还有一个bif spawn_link通常用于执行相同的操作。

所以基本上什么时候应该使用spawnspawn_link

2 个答案:

答案 0 :(得分:12)

手动执行spawn然后linkspawn_link的操作相同,但它并不等同于时间;特别是它不是原子的(如两个独立的操作,而不是一个不可分割的操作)。如果您生成一个进程并且它在初始化时死亡(无论您的startinit函数是什么),那么在对link的调用完成之前它可能会死,并且链接的进程永远不会收到通知,因为该进程在链接之前已经死亡。糟糕!

来自Joe Armstrong&#39> 编程Erlang 第13章"为什么产卵和连接必须是原子操作":

  

曾几何时,Erlang有两个原语,spawnlink,而spawn_link(Mod, Func, Args)的定义如下:

spawn_link(Mod, Func, Args) ->
    Pid = spawn(Mod, Func, Args),
    link(Pid),
    Pid.
  

然后发生了一个模糊的错误。生成的进程在调用link语句之前就已经死了,因此进程死了,但没有生成错误信号。这个bug需要很长时间才能找到。为了解决这个问题,spawn_link被添加为原子操作。当涉及并发时,即使看起来很简单的程序也会很棘手。

答案 1 :(得分:1)

spawn只会产生一个新流程。

spawn_link生成一个新进程,并自动在调用进程和新进程之间创建一个链接。所以它可以实现为:

my_spawn_link(Module, Function, Args) ->
    Pid = spawn(Module, Function, Args),
    link(Pid),
    Pid.