我正在阅读有关 go 包“运行时”的信息,并看到我可以在其他 (func GOMAXPROCS(n int)) 中设置可用于运行我的程序的 CPU 单元的数量。我可以强制 goroutine 在我选择的特定 CPU 上运行吗?
最佳答案
在现代 Go 中,为了提高效率,我不会将 goroutine 锁定到线程。去 1.5 added goroutine scheduling affinity, to minimize how often goroutines switch between OS threads . CPU 之间剩余迁移的任何成本都必须与用户模式调度程序避免上下文切换到内核模式的好处进行权衡。最后,当切换成本是一个真正的问题时,有时更好的重点是改变你的程序逻辑,这样它就需要更少的切换,比如通过通信批量工作而不是单个工作项。
但即使考虑到所有这些,有时您只需要锁定一个 goroutine,例如当 C API 需要它时,我会假设下面是这种情况。
如果整个程序以 GOMAXPROCS=1
运行,那么 it's relatively simple to set a CPU affinity by calling out to the taskset utility from the schedutils package .
我原以为如果 GOMAXPROCS > 1
你不走运,因为那时 goroutines are migrated between OS threads at runtime .事实上,James Henstridge 指出你可以使用 runtime.LockOSThread()
防止你的 goroutine 迁移。但是,一旦您将 goroutine 锁定到它,我不知道有任何 Go stdlib 函数来设置当前线程的 CPU 亲和性。您也许可以使用 cgo 并调用 pthread_setaffinity_np
, 因为显然 Go uses pthreads in cgo mode .由于我们讨论的是系统调用,因此细节会因操作系统而异。
(如果你的整个程序是纯 Go(没有 C 链接),它可以通过 syscall
模块使用零 pid
参数调用 sched_setaffinity
。但这会很棘手。)
关于go - 是否可以强制 go 例程在特定 CPU 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19758961/