在双核cpu上运行GO runtime.GOMAXPROCS(4)

在双核cpu上运行GO runtime.GOMAXPROCS(4),go,concurrency,Go,Concurrency,对不起,如果这听起来很愚蠢的话 如果运行runtime.GOMAXPROCS(4)而runtime.numpu()==2runtime,会发生什么情况。GOMAXPROCS控制将创建多少操作系统级线程来运行程序的goroutines(以及为其供电的运行时)。(运行时本身将为自己创建多个线程,但这并不重要。) 基本上,这就是将要发生的一切 但据推测,您实际上是想问“这将如何影响我的程序的性能?”之类的问题,对吗? 如果是,答案是“视情况而定”。 我不确定您是否有机会使用只有一个CPU和一个内核的系

对不起,如果这听起来很愚蠢的话


如果运行
runtime.GOMAXPROCS(4)
runtime.numpu()==2
runtime,会发生什么情况。GOMAXPROCS
控制将创建多少操作系统级线程来运行程序的goroutines(以及为其供电的运行时)。(运行时本身将为自己创建多个线程,但这并不重要。)

基本上,这就是将要发生的一切

但据推测,您实际上是想问“这将如何影响我的程序的性能?”之类的问题,对吗? 如果是,答案是“视情况而定”。 我不确定您是否有机会使用只有一个CPU和一个内核的系统(基本上是大多数消费级IBM PC兼容计算机,直到奔腾®CPU的这一代,奔腾®CPU采用了所谓的“超线程”技术),但这些系统通常在一台计算机上运行数百到数千个操作系统线程“单核”(这个词在当时的主流中并不存在,但还可以)

另一个要考虑的是,你的程序不是孤立运行的:在同一个CPU上运行的还有其他程序,内核本身也有几个内核线程。 您可以使用

top
htop
之类的工具来评估系统当前在所有内核上调度的线程数

此时,您可能想知道为什么Go运行时默认创建与物理内核数量相同的线程来支持Goroutine

据推测,这来自一个简单的事实,即在典型的服务器端工作负载中,您的程序在某种程度上是“主程序”。 换句话说,它的线程与线程的争用
运行时。GOMAXPROCS控制将创建多少操作系统级线程来运行程序的goroutines(以及为其提供电源的运行时)。(运行时本身将为自己创建多个线程,但这不是重点。)

基本上,这就是将要发生的一切

但据推测,您实际上是想问“这将如何影响我的程序的性能?”之类的问题,对吗? 如果是,答案是“视情况而定”。 我不确定您是否有机会使用只有一个CPU和一个内核的系统(基本上是大多数消费级IBM PC兼容计算机,直到奔腾®CPU的这一代,奔腾®CPU采用了所谓的“超线程”技术),但这些系统通常在一台计算机上运行数百到数千个操作系统线程。”“单核”(这个词在当时的主流中并不存在,但还可以)

另一个要考虑的是,你的程序不是孤立运行的:在同一个CPU上运行的还有其他程序,内核本身也有几个内核线程。 您可以使用

top
htop
之类的工具来评估系统当前在所有内核上调度的线程数

此时,您可能想知道为什么Go运行时默认创建与物理内核数量相同的线程来支持Goroutine

据推测,这来自一个简单的事实,即在典型的服务器端工作负载中,您的程序在某种程度上是“主程序”。 换句话说,它的线程与线程的争用
您将有4个OS线程运行goroutines,而不是2个您将有4个OS线程运行goroutines,而不是2个您的答案甚至清除了您在“性能”中提到的我的其他查询:)很多Thanks@STEEL,你也可能对阅读和阅读感兴趣(较旧但仍然基本正确,并且比以前更具解释性)详细说明Go runtime scheduler如何在操作系统线程上执行goroutines的文档。您的回答甚至清除了您在“性能”中介绍的我的其他查询:)许多Thanks@STEEL,你也可能对阅读和阅读感兴趣(较旧但仍然基本正确,并且比以前更具解释性)详细说明Go运行时调度器如何在OS线程上执行goroutines的文档。