在简要回顾了Go语言规范,有效的Go和Go内存模型之后,我仍然不清楚Go通道是如何工作的。
它们是什么样的结构?它们的行为有点像线程安全队列/数组。
它们的实现取决于体系结构吗?
Answers:
通道的源文件位于/src/pkg/runtime/chan.go中(从您的源代码根目录开始)。
hchan
是通道的中央数据结构,带有发送和接收链接列表(持有指向其goroutine和data元素的指针)和一个closed
标志。Lock
在runtime2.go中定义了一个嵌入式结构,根据操作系统的不同,该结构可用作互斥体(futex)或信号灯。根据构建标记,锁定实现位于lock_futex.go(Linux / Dragonfly / Some BSD)或lock_sema.go(Windows / OSX / Plan9 / Some BSD)中。
通道操作都在此chan.go文件中实现,因此您可以看到makechan,send和receive操作以及select构造,close,len和cap内置函数。
要深入了解通道的内部工作原理,您必须阅读Dmitry Vyukov亲自撰写的关于类固醇的Go通道(Go核心开发人员,goroutines,调度程序和通道等)。
这是一个很好的演讲,大致描述了渠道的实现方式:https:
//youtu.be/KBZlN0izeiY
谈话说明:
GopherCon 2017:Kavya Joshi-了解频道
通道提供了goroutine进行通讯的简单机制,并提供了构建复杂的并发模式的强大构造。我们将深入研究通道和通道操作的内部工作原理,包括运行时调度程序和内存管理系统如何支持它们。