Go 语言可以限制运行时操作系统线程的数量。
Go 语言的运行时系统使用了自己的调度器,该调度器使用了 M:N 模型,也就是说,M 个 goroutine 可以运行在 N 个操作系统线程上。我们可以通过设置环境变量 GOMAXPROCS
或使用 runtime.GOMAXPROCS
函数来限制 Go 程序可以使用的操作系统线程数。
设置环境变量 GOMAXPROCS
:
export GOMAXPROCS=4
使用 runtime.GOMAXPROCS
函数:
Go
func main() {
runtime.GOMAXPROCS(4)
}
默认情况下,GOMAXPROCS
的值为 10000。
注意:
- 限制操作系统线程数量可能会影响程序的性能。
- 如果程序使用了大量的 goroutine,则需要设置较高的
GOMAXPROCS
值。
常见的 goroutine 操作函数
- 创建 goroutine:
Go
go func() {
// ...
}()
- 等待 goroutine 结束:
Go
go func() {
// ...
}()
.
.
.
waitGroup.Wait()
- 杀死 goroutine:
Go
go func() {
// ...
}()
.
.
.
runtime.Goexit()
- 发送数据到 channel:
Go
ch := make(chan int)
go func() {
ch <- 1
}()
- 从 channel 接收数据:
Go
ch := make(chan int)
go func() {
v := <-ch
// ...
}()
- 关闭 channel:
Go
ch := make(chan int)
close(ch)
- 检查 channel 是否关闭:
Go
ch := make(chan int)
close(ch)
if closed(ch) {
// ...
}
- 超时操作:
Go
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
go func() {
// ...
}()
select {
case <-ctx.Done():
// ...
}
总结:
Go 语言提供了丰富的 goroutine 操作函数,可以满足各种并发编程需求。