我知道goroutine的重量很轻,我们可以生成成千上万个goroutine,但是我想知道是否存在某些情况下应该生成进程而不是goroutine(例如在资源方面达到某种流程边界)或者是其他东西)。在某些情况下产生新流程在资源利用率或其他方面是否有好处?
答案 0 :(得分:2)
要开始,这是三个原因。我确定还有更多。
原因1
在一个理想的世界中,CPU会忙于尽其所能进行最重要的工作(而不是在等待更重要的工作时浪费时间去做次要的工作)。
要执行此操作,无论控制CPU的工作(调度程序)是什么,都必须知道每个工作的重要性。通常,这是通过(例如)线程优先级完成的。当有两个或两个以上相互隔离的进程时,无论控制CPU做什么工作,都不能成为这两个进程的一部分。否则,您会遇到一个情况,即一个进程正在消耗CPU时间进行不重要的工作,因为它不知道还有另一个进程希望CPU从事更重要的工作。
这就是为什么诸如“ goroutines”之类的东西坏了(不如普通的旧线程)的原因。他们根本做不到正确的事情(除非有不止一个进程需要CPU时间)。
流程(与“流程优先级”结合使用)可以解决该问题(同时添加其他多个问题)。
原因#2
在理想世界中,软件永远不会崩溃。现实情况是有时进程确实崩溃(有时原因与软件无关-例如硬件缺陷)。具体来说,当一个进程崩溃时,通常没有理智的方法来告知该进程造成了多少损失,因此整个进程通常会终止。为了解决这个问题,人们使用某种形式的冗余(多个冗余过程)。
原因#3
在理想情况下,所有CPU和所有内存将相等。实际上,事情并不会像这样扩展,因此您会得到诸如ccNUMA之类的东西,其中CPU可以快速访问同一NUMA域中的内存,而同一CPU无法快速访问不同NUMA域中的内存。为了解决这个问题,理想情况下(分配内存时)您要告诉操作系统“此内存需要的延迟比带宽还低”(并且操作系统只会为最快/最近的NUMA域分配内存),或者您要告诉操作系统操作系统“此内存需要比低延迟更多的高带宽”(并且操作系统将从所有NUMA域分配内存)。可悲的是,我见过的每种语言都有“复古笑话内存管理”(没有任何“带宽,延迟,安全”提示);这意味着您获得的唯一控制权是“分布在所有NUMA域中的一个进程与每个NUMA域中的一个进程”之间的选择。