在 Scala 或 Elixir 这样的基于 Actor 的语言中还会发生死锁吗?如果是,如何检测和避免它们?
在 Erlang 中这是可能的。您可以有 2 个进程都在等待对方发送消息。一般来说,这不是一个大问题。
但在大多数情况下,你必须努力才能实现这一目标。
Scala 不是一种基于 Actor 的语言。 Akka 只是一个库(恕我直言,它经常被滥用)。
可能会发生死锁,因为您可以在
receive
方法内运行任意代码。
为了防止这种情况 - 不要直接在参与者代码中使用任何阻塞/同步,也不要调用内部使用阻塞的外部对象的方法。
如果大多数参与者的邮箱(队列)已满,他们可能会陷入僵局。在实际系统中,内存是有限的,队列也不是无限的。