Goroutines是使并发易于使用。这个想法已经存在了一段时间,它将独立执行的函数 - 协程 - 复用到一组线程上。当协程阻塞时,例如通过调用阻塞系统调用,运行时自动将同一操作系统线程上的其他协同程序移动到另一个可运行的线程,这样它们就不会被阻塞。程序员没有看到这一点,这就是重点。结果,我们称之为goroutines,可以非常便宜:它们在堆栈的内存之外几乎没有开销,这只是几千字节。
为了使堆栈变小,Go的运行时使用可调整大小的有限堆栈。一个新的goroutine给了几千字节,这几乎总是足够的。如果不是,运行时会自动增长(并缩小)内存以自动存储堆栈,从而允许许多goroutine存在于适量的内存中。CPU开销平均每个函数调用大约三个便宜的指令。在同一地址空间中创建数十万个goroutine是切实可行的。如果goroutines只是线程,系统资源将以更小的数量运行。
网友评论