在特定的CPU上运行,而不是一个goroutine?

时间:2016-08-24 09:10:01

标签: windows go

golang只有一个方法runtime.GOMAXPROCS(1)来设置应用程序同时运行一个goroutine,但我想让应用程序只运行在特定的cpu上?

1 个答案:

答案 0 :(得分:0)

gc 编译器( 6g 8g )下,您必须将 GOMAXPROCS 设置为超过默认值1允许运行时支持使用多个OS线程,即所有goroutine共享相同的线程,除非GOMAXPROCS设置为大于1 的值。

GOMAXPROCS 大于1时,它们会在具有该多个线程的线程池上运行。使用 gccgo 编译器,GOMAXPROCS实际上等于运行goroutine的数量。假设n是计算机上的处理器或核心数。如果您设置环境变量GOMAXPROCS >= n,或调用runtime.GOMAXPROCS(n),则会划分(分布式)goroutines 在n个处理器中。

然而,更多的处理器并不一定意味着性能的线性改善,主要是因为需要更多的通信:消息传递开销增加。经验法则似乎是,对于n个核心,将 GOMAXPROCS设置为n-1 会产生最佳性能,并且还应遵循以下内容:

number of goroutines > 1 + GOMAXPROCS > 1

因此,如果在某个时间点只执行一个goroutine,请不要设置GOMAXPROCS!

如果您希望将goroutine锁定到特定的OS线程,可以使用runtime.LockOSThread执行此操作。

  

LockOSThread将调用goroutine连接到其当前操作   系统线程。直到呼叫goroutine退出或呼叫   UnlockOSThread,它将始终在该线程中执行,而不是其他   goroutine可以。

有关https://golang.org/pkg/runtime/的更多信息。