在Google I/O 2012演示文稿Go Concurrency Patterns中,Rob Pike提到一个线程中可以存在多个goroutines.这是否意味着它们被实现为coroutines?如果没有,如何实施?欢迎链接到源代码.
在Google I/O 2012演示文稿Go Concurrency Patterns中,Rob Pike提到一个线程中可以存在多个goroutines.这是否意味着它们被实现为coroutines?如果没有,如何实施?欢迎链接到源代码.
不完全是.Go FAQ部分Why goroutines instead of threads?解释:
Goroutine是使并发性易于使用的一部分.这个 idea 已经有一段时间了,它是将独立执行的函数(协程)多路复用到一组线程上.当协程阻塞时(例如通过调用阻塞系统调用),运行时会自动将同一操作系统线程上的其他协程移动到不同的可运行线程,这样它们就不会被阻塞.程序员对此一无所知,这就是问题所在.我们称之为goroutines的结果可能非常便宜:除了堆栈只有几千字节的内存之外,它们几乎没有开销.
为了使堆栈更小,Go的运行时使用可调整大小的有界堆栈.一个新造的Goroutine被赋予几千字节,这几乎总是足够的.如果不是这样,运行时会增加(和缩小)用于自动存储堆栈的内存,从而允许许多Goroutine在适度的内存中运行.每个函数调用的CPU开销平均约为3条廉价指令.在同一地址空间中创建数十万个Goroutine是可行的.如果goroutines仅仅是线程,那么系统资源耗尽的数量会少得多.