合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[TOC] ## 概述 goroutine和操作系统的线程区别可以先忽略。尽管两者的区别实际上只是一个量的区别,但是量变产生质变 ## 动态栈 * 每一个OS线程都有一个固定大小的内存块(一般会是2MB)来做栈,这个栈会用来存储当前正在被调用或挂起(指在调用其它函数时)的函数的内部变量。 * 2MB的栈对于一个小小的goroutine来说是很大的内存浪费,比如对于我们用到的,一个只是用来WaitGroup之后关闭channel的goroutine来说 * 固定大小的栈对于更复杂或者更深层次的递归函数调用来说显然是不够的 ## 协程 * 一个goroutine会以一个很小的栈开始其生命周期,一般只需要2KB * 一个goroutine的栈,和操作系统线程一样,会保存其活跃或挂起的函数调用的本地变量, * OS线程不太一样的是一个goroutine的栈大小并不是固定的;栈的大小会根据需要动态地伸缩 * goroutine的栈的最大值有1GB