如何实施Go渠道?


68

在简要回顾了Go语言规范,有效的Go和Go内存模型之后,我仍然不清楚Go通道是如何工作的。

它们是什么样的结构?它们的行为有点像线程安全队列/数组。

它们的实现取决于体系结构吗?


Answers:


82

通道的源文件位于/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,调度程序和通道等)。


10

这是一个很好的演讲,大致描述了渠道的实现方式:https
//youtu.be/KBZlN0izeiY

谈话说明:

GopherCon 2017:Kavya Joshi-了解频道

通道提供了goroutine进行通讯的简单机制,并提供了构建复杂的并发模式的强大构造。我们将深入研究通道和通道操作的内部工作原理,包括运行时调度程序和内存管理系统如何支持它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.