MENU

[FAQ]为什么使用Go协程而非线程?

November 7, 2020 • Go FAQ

Go协程是让使发易于使用的一部分。这个想法已经存在了一段时间,它是将独立执行的函数—— 协程——多路复用到一组线程上。当协程被阻塞,如通过调用一个阻塞的系统调用时, 运行时会在相同的操作系统线程上自动将其它的协程转移到一个不同的,可运行的, 不会被阻塞的线程上。重点是程序员不会看见。结果,我们称之为Go协程,可以非常廉价: 除非它们在在长期运行的系统调用上花费了大量的时间,否则它们只会花费比栈多一点的内存, 那只有几KB而已。

为了使栈很小,Go的运行时使用了分段式栈。一个新创建的Go协程给定几KB,这几乎总是足够的。 当它不够时,运行时会自动地分配(并释放)扩展片段。每个函数调用平均需要大概三条廉价的指令。 这实际上是在相同的地址空间中创建了成百上千的Go协程。如果Go协程是线程的话,系统资源会更快地耗尽。

ArchivesQR Code
QR Code for this page
Tipping QR Code