当我需要创建一个流程时,我将使用常规的spawn bif。但是还有一个bif spawn_link通常用于执行相同的操作。
那么基本上什么时候应该使用spawn
和spawn_link
?
先执行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.
然后发生了一个模糊的错误。生成的进程在调用link语句之前就已终止,因此该进程终止了,但是未生成任何错误信号。这个错误花了很长时间才找到。为了解决这个问题,它
spawn_link
被添加为原子操作。当涉及到并发时,即使外观简单的程序也可能很棘手。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句