我目前正在学习 Scala 中的演员。本书推荐使用react
方法而不是receive
,因为它允许系统使用更少的线程。
我已经阅读了为什么创建线程很昂贵。但是,一旦你有了线程(在初始化之后应该为 Scala 中的演员系统保留),让它们周围存在代价高昂的原因是什么?
主要是内存消耗吗?还是有其他原因?
我目前正在学习 Scala 中的演员。本书推荐使用react
方法而不是receive
,因为它允许系统使用更少的线程。
我已经阅读了为什么创建线程很昂贵。但是,一旦你有了线程(在初始化之后应该为 Scala 中的演员系统保留),让它们周围存在代价高昂的原因是什么?
主要是内存消耗吗?还是有其他原因?
使用多个线程可能比您预期的要昂贵,因为:
除了周围有线程的内存开销(可能很小也可能不小),周围有更多线程通常还意味着调度将有更多的元素需要考虑,以便选择哪个线程将获得 CPU下一个。
一些操作系统/JVM 也可能对可以同时存在的线程数量有限制。
最终,它是小额间接费用的积累,最终可能占很大比例。而且这些都不是 Java 特有的。
有线程并不“昂贵”。当然,这有点取决于我们在这里谈论的数量。我怀疑数十亿个线程会是个问题。我认为一般来说,拥有很多线程被认为是昂贵的,因为你可以做更多的并行工作,所以 CPU 上升,内存上升等等......但如果它们得到正确管理(例如池化以保护系统资源),那么没关系。JVM 不一定使用本机线程,因此 Java 线程不一定映射到 OS 本机线程(例如,查看绿色线程或轻量级线程)。在我看来,JVM 中的线程没有隐含的成本。成本来自于糟糕的线程管理和不小心分配资源而过度使用资源。