进程、进程内的线程和进程内协程(也叫轻量级线程)是一个抽象的概念。
与传统的系统级线程和进程相比,协程的最大优势在于其“轻量级”,可以轻松创建百万个甚至千万个而不会导致系统资源耗尽;而线程和进程通常最多也不能超过一万个。
Go语言在语言级别支持轻量级线程,叫 goroutine,执行时只需要4-5k的内存,比线程更易用,更高效轻便,调度开销更小,可同时运行上千万个并发。
Go语言中的轻量级线程的切换管理不依赖于系统的线程和进程,也不依赖于CPU的核心数量。
Go实现轻量级线程非常简单,下面将展示如何创建一百万个轻量级线程:
package main
import (
"fmt"
"runtime"
"time"
)
var start = make(chan bool)
func main() {
runtime.GOMAXPROCS(4) //CPU核心数
for i := 0; i < 1000000; i++ {
go sayhello(i)
}
fmt.Println("一百万个协程创建完毕,60秒后开始同时运行!")
time.Sleep(time.Second*60)
close(start)
time.Sleep(time.Second*60)//主线程Sleep 60秒,确保所有任务全部执行完成。
}
func sayhello(i int) {
<- start
fmt.Println("hello",i)
}
上述代码将创建 100万个轻量级 goroutine ,并同时执行,确保有足够的可用内存哦。