当我需要创建一个进程时,我将使用习惯的spawn bif.But还有一个bif spawn_link通常用于执行相同的操作。
所以基本上什么时候应该使用spawn
和spawn_link
?
答案 0 :(得分:12)
手动执行spawn
然后link
与spawn_link
的操作相同,但它并不等同于时间;特别是它不是原子的(如两个独立的操作,而不是一个不可分割的操作)。如果您生成一个进程并且它在初始化时死亡(无论您的start
或init
函数是什么),那么在对link
的调用完成之前它可能会死,并且链接的进程永远不会收到通知,因为该进程在链接之前已经死亡。糟糕!
来自Joe Armstrong&#39> 编程Erlang 第13章"为什么产卵和连接必须是原子操作":
曾几何时,Erlang有两个原语,
spawn
和link
,而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.