golang
只有一个方法runtime.GOMAXPROCS(1)
来设置应用程序同时运行一个goroutine
,但我想让应用程序只运行在特定的cpu上?
答案 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/的更多信息。