Go语言特性与Java对比详解
1. Go语言中的Goroutine调度与控制
在Go语言里,若goroutine执行操作导致其执行受阻,或者主动放弃线程,它的线程会被分离并分配给其他goroutine。当goroutine发起阻塞式操作系统调用时,Go调度器同样能分离线程。所以,调度器可能存在两个线程池,一个用于CPU密集型goroutine,另一个用于I/O密集型goroutine。
Go提供了有限的方式来控制用于执行goroutine的操作系统线程。我们可以通过 GOMAXPROCS
环境变量和 runtime.GOMAXPROCS(n int)
函数来设置运行goroutine可用的最大CPU(或核心)数量。
借助 Contexts
,Go能够以编程方式取消或超时处理长时间运行的异步进程,像goroutine中的循环以及网络或数据库请求等。 Context
还提供了一个通道,用于通知监听器长时间运行的进程已完成(正常完成或超时)。
runtime.Goexit()
函数会在运行完所有延迟函数后终止调用的goroutine。要注意, main
函数运行在一个goroutine上,当 main
函数所在的goroutine退出(返回)时,程序就会结束,这和所有非守护线程结束时JVM结束的情况类似。
runtime.Gosched()
函数会使当前goroutine主动放弃其线程,但仍保持可运行状态,这