西西河

主题:【原创】介绍一下Go语言(1)之前的话 -- zllwy

共:💬92 🌺231
全看分页树展 · 主题 跟帖
家园 谢谢

先解释一下为什么goroutine比thread要轻。goroutine是用户空间的,所以切换goroutine要比thread的花费要小。thread的初始堆栈比较大(几个MB),而goroutine初始堆栈比较小(20KB),而且是动态缩放的。所以可以同时创建比thread可以大得多的数量的goroutine。

我觉得你对channel的理解是对的。本质上通过share memory来通信使得程序引入了非确定性。两个并行的程序如何访问一块共享的内存,其执行过程是不确定的。但如果通过channel,那就很明确什么时候要通信。至于性能,不是最主要的。因为channel很可能就是利用mutex来实现的。channel是比buffer/mutex更高一层的抽象。主要的目的还是使程序逻辑本身更加清晰,减少发生错误的可能性,尽量把非确定性缩小到可控的范围(比如channel底层的实现)。有时候为了性能需要,mutex也还是可能需要用到。比如在go的mailing list讨论过goroutine的barrier的问题。如果同时生成一组goroutines,需要等他们都运行结束然后取所有的结果。这个barrier的实现可以用channel,但效率比较低。Go还没有一个好的抽象来解决这个问题。最高效的方案还是用mutex来实现。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河