2016-08-24 103 views
2

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

+1

start/affinity 1 gobinary.exe –

+0

设置处理器亲和性是操作系统特定的,最好在流程本身之外完成。像Linux上的'taskset'这样的命令行工具通常用于执行此操作。 – JimB

回答

2

要启动去你的二进制文件,说example.exe使得它只能运行在CPU 0在Windows上,你可以使用start命令与“亲和”参数:

start /affinity 1 example.exe 

我不知道到底有什么你试图实现但参考this document describing GOMAXPROCS - Go运行时可能会更有效地做同样的事情。

0

GC编译器(6克8克),你必须设置GOMAXPROCS为比默认值大1到允许运行时支持使用多个操作系统线程,这是所有goroutines共享相同的线程,除非GOMAXPROCS设置为大于1的值

GOMAXPROCS大于1时,它们运行在具有多个线程的线程池中。使用gccgo编译器GOMAXPROCS实际上等于正在运行的goroutines的数量。假设n是机器上的处理器或内核的数量。如果您设置环境变量GOMAXPROCS >= n,或者致电runtime.GOMAXPROCS(n),则在n个处理器中将会议室分开(分配) 。

然而,更多的处理器并不一定意味着性能的线性改进,主要是因为需要更多的通信:消息传递开销增加。拇指的经验法则似乎是n个内核设置GOMAXPROCS到n-1得到最好的性能,同时也应遵循以下几点:

number of goroutines > 1 + GOMAXPROCS > 1

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

如果您希望将goroutine锁定到特定的操作系统线程,则可以使用runtime.LockOSThread来完成此操作。

LockOSThread将调用的goroutine连接到其当前正在运行的 系统线程。在调用goroutine退出或调用UnlockOSThread之前,它将始终在该线程中执行,并且没有其他 goroutine可以执行。

更多关于https://golang.org/pkg/runtime/

+1

我认为它根本不回答OP的问题。另外,OS线程!= CPU核心,我相信这是OP要求的。 – syntagma

相关问题