进程是操作系统分配资源的基本单位,线程才是执行任务的最小执行单位。一个进程内可以有多个线程。而Go语言的并发模型则是使用了Coroutine协程。协程也是通过线程来执行的。Go语言调度算法会为每个线程提供一个Coroutine执行队列。当有一个Coroutine执行了一个系统调用并且阻塞时,该线程会被挂起,那该线程就没有办法继续去执行其他Coroutine了,此时Go语言的调度算法就将该线程的Coroutine队列转移到其他线程的队列当中。当该线程从阻塞恢复后,再从其他线程的Coroutine队列拿一些回来执行,使得各个线程的执行效率得到有效保证,这也是Go语言在并发方面这么厉害的原因。
它的简洁之处在于启动Coroutine的方式,只需要关键字go加函数调用,如:
go
package main
import "fmt"
import "time"
func main() {
fmt.Println("start")
go func() { // 开协程
fmt.Println("Corountine")
}()
time.Sleep(time.Second * 1)
fmt.Println("end")
}
在Go语言中,程序一启动,main就是第一个Coroutine。