Go语言并发与基础特性详解
1. Go语言中的Goroutine
Goroutine是Go语言中轻量级的执行单元,它的调度机制灵活。当Goroutine阻塞执行或主动放弃线程时,其线程会被分离并分配给其他Goroutine。若Goroutine发起阻塞的操作系统调用,Go调度器也能分离线程。调度器可能有两个线程池,一个用于CPU密集型Goroutine,另一个用于I/O密集型Goroutine。
Go语言对操作系统线程的控制手段有限,可以通过 GOMAXPROCS
环境变量和 runtime.GOMAXPROCS(n int)
函数设置运行Goroutine可用的最大CPU(或核心)数。
Go语言还能通过 Context
以编程方式取消或超时处理长时间运行的异步进程,如Goroutine中的循环、网络或数据库请求等。 Context
还提供一个通道,用于通知监听器长时间运行的进程已完成(正常完成或超时)。
-
runtime.Goexit()
函数:在运行完所有延迟函数后终止调用的Goroutine。主函数运行在一个Goroutine上,当主Goroutine退出(返回)时,程序结束,这类似于JVM在所有非守护线程结束时终止。 -
runtime.Gosched()
函数:使当前Goroutine主动放弃其线程,但仍保持可运行状态,类似于Java中的Thread.yield()
,在长时间运行的代码段(如循环)中使用效果较