当前位置: 首页 > 面试题库 >

Go运行时使用的线程数

谭修竹
2023-03-14
问题内容

Go运行时(调度程序,垃圾回收器等)可以使用多少个线程?例如,如果GOMAXPROCS为is 10,那么运行时将使用哪些内核线程?

编辑:

我读的理由改变GOMAXPROCSruntime.NumCPU()围棋1.5。有句话宣称“
GOMAXPROCS由于运行时的并行性,尤其是垃圾收集器的并行性,可以提高单goroutine程序的性能。”

我的真正问题是:如果我在具有CPU配额的Docker容器中运行一个单程序程序,那么要获得最高性能,我需要的最小逻辑处理器数是多少。


问题答案:

没有直接的相关性。您的应用使用的线程数可能小于,等于或大于10。

引用的软件包文档runtime

GOMAXPROCS变量限制了可以同时执行用户级Go代码的操作系统线程的数量。
对于代表Go代码的系统调用中可以阻止的线程数量没有限制;那些不计入GOMAXPROCS限制。该软件包的GOMAXPROCS函数查询并更改限制。

因此,如果您的应用程序没有启动任何新的goroutine,则线程数将少于10。

如果您的应用程序启动了许多goroutine(> 10),其中没有一个阻塞(例如,在系统调用中),则10个操作系统线程将同时执行您的goroutine。

如果您的应用程序启动了许多goroutine,而这些goroutine在系统调用中被阻止(超过10个),则将产生10个以上的OS线程(但最多只能执行10个执行用户级Go代码)。

请参阅以下问题的示例和详细信息:当在golang中写入文件时,由于阻塞了许多goroutine,为什么为什么它不会创建很多线程?

编辑(响应您的编辑):

我相信的默认值GOMAXPROCS是逻辑CPU的数量,这是有原因的:因为通常提供最高的性能。您可以将其保留。通常,如果您只有1个goroutine,并且确定您的代码不会产生更多代码就GOMAXPROCS=1足够了,但是您应该进行测试并且不要花任何时间。



 类似资料:
  • 我尝试在每次创建活动时运行以下线程。它第一次工作,但如果我按下后退按钮并尝试再次导航到活动,它总是崩溃第二次。我怎样才能确保这个线程每次都运行成功呢?

  • 问题内容: 我已经研究了很多关于Java线程的教程,但是找不到答案。 我的问题是:如何同时运行两个独立的线程? 我的情况是:我有两个任务; 保存一些数据到数据库 在移动设备上发送推送通知。 由于这两个任务是独立的,因此我想同时执行它们。 我尝试使用具有两个线程的线程池,但是问题是数据库任务很快完成,但是发送推送通知需要一些时间。 因此,当一个任务完成而另一个任务仍未完成时,它将引发异常。 我的代码

  • 问题内容: 因此,我的目标是让函数启动自己的线程,以便可以并行运行,而不必等待上一个线程完成。问题在于,它似乎不是多线程的(意味着一个线程在另一个线程开始之前就完成了)。 我也有该函数的内部,但似乎启动的线程的标识与从其运行python脚本的主线程相同。我认为我的方法不正确。 问题答案: 这是常见错误,容易出错。 只需在主线程中一次执行您的函数,然后将(我想为您函数的返回值)作为函数传递给线程,这

  • 尽管 Go 编译器产生的是本地可执行代码,这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 runtime 包中找到)当中。这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收(第 10.8 节)、栈处理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。 runtime 主要由

  • std::thread::hardware_concurrency()在新版C++标准库中是一个很有用的函数。这个函数将返回能同时并发在一个程序中的线程数量。例如,多核系统中,返回值可以是CPU核芯的数量。返回值也仅仅是一个提示,当系统信息无法获取时,函数也会返回0。但是,这也无法掩盖这个函数对启动线程数量的帮助。 清单2.8实现了一个并行版的std::accumulate。代码中将整体工作拆分成

  • 问题内容: 我有要处理的网址列表,但我想一次运行最大数量的goroutine。例如,如果我有30个网址,那么我只希望10个goroutine并行工作。 我对此的尝试如下: 我的理解是,如果创建一个大小为并行的缓冲通道,那么该代码将阻塞,直到我读取结果通道为止,这将取消阻塞我的代码并允许生成另一个goroutine。但是,此代码似乎在处理完所有网址后不会阻塞。有人可以向我解释如何使用通道限制运行的g