进程、进程内的线程和进程内协程(也叫轻量级线程)是一个抽象的概念。

与传统的系统级线程和进程相比,协程的最大优势在于其“轻量级”,可以轻松创建百万个甚至千万个而不会导致系统资源耗尽;而线程和进程通常最多也不能超过一万个。

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 ,并同时执行,确保有足够的可用内存哦。