golang技术笔记之goroutine

进程、线程和协程:

1.进程:分配完整独立的地址空间,拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程的切换只发生在内核态,由操作系统调度。

2.线程:和其它本进程的线程共享地址空间,拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程的切换一般也由操作系统调度(标准线程是的)。

3.协程:和线程类似,共享堆,不共享栈,协程的切换一般由程序员在代码中显式控制。

一般来说,如果没有显式的让出CPU,就会一直执行当前协程。

goroutine可以看作是协程的go语言实现;

浅析goroutine:

它的调度一定程度上是由go运行时(runtime)管理。其好处之一是,当某goroutine发生阻塞时(例如同步IO操作等),会自动出让CPU给其它goroutine。

goroutine的使用非常简单,例如foo是一个函数:

go foo()

就一个关键字go搞定了,这里会启动一个goroutine执行foo函数,然后CPU继续执行后面的代码。

goroutine是非常轻量级的,它就是一段代码,一个函数入口,以及在堆上为其分配的一个堆栈(初始大小为4K,会随着程序的执行自动增长删除)。所以它非常廉价,我们可以很轻松的创建上万个goroutine。

你可能感兴趣的:(golang技术笔记之goroutine)