进程、线程和协程:
1.进程:分配完整独立的地址空间,拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程的切换只发生在内核态,由操作系统调度。
2.线程:和其它本进程的线程共享地址空间,拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程的切换一般也由操作系统调度(标准线程是的)。
3.协程:和线程类似,共享堆,不共享栈,协程的切换一般由程序员在代码中显式控制。
一般来说,如果没有显式的让出CPU,就会一直执行当前协程。
goroutine可以看作是协程的go语言实现;
浅析goroutine:
它的调度一定程度上是由go运行时(runtime)管理。其好处之一是,当某goroutine发生阻塞时(例如同步IO操作等),会自动出让CPU给其它goroutine。
goroutine的使用非常简单,例如foo是一个函数:
go foo()
就一个关键字go搞定了,这里会启动一个goroutine执行foo函数,然后CPU继续执行后面的代码。
goroutine是非常轻量级的,它就是一段代码,一个函数入口,以及在堆上为其分配的一个堆栈(初始大小为4K,会随着程序的执行自动增长删除)。所以它非常廉价,我们可以很轻松的创建上万个goroutine。