首页IT科技命名管道和无名管道的区别(Go 语言入门 1-管道的特性及实现原理)

命名管道和无名管道的区别(Go 语言入门 1-管道的特性及实现原理)

时间2025-05-04 17:37:23分类IT科技浏览4636
导读:入坑 go 也快一年了,从今天开始会定期分享一下 Go 语言学习过程中的一些基础知识。...

入坑 go 也快一年了            ,从今天开始会定期分享一下 Go 语言学习过程中的一些基础知识             。

go 语言中的管道                   , 主要是用于协程之间的通信      , 比 UNIX 的管道更加轻量和易用                  。

我们先看一下管道的数据结构:

type hchan struct {gcountuint//环形队列剩余元素个数dataqsizuint//环形队列长度bufunsafe.Pointer // 环形队列指针elemsizeuint16 // 每个元素大小closeduint32//标识关闭状态elemtype*_type// 元素类型sendxuint//下一个元素写入时的下标recvxuint//下一个元素读取时的下标recvqwaitq // 等待读消息的队列sendqwaitq // 等待写消息的队列lockmutex//互斥锁         ,保障管道无法并发读写}

源码链接:

https://github.com/golang/go/blob/0d0193409492b96881be6407ad50123e3557fdfb/src/runtime/chan.go#L33

通过上述数据结构                   , 我们可以理解管道是由三部分组成的:

环形队列

读写等待队列

队列元素基本信息

从管道读取数据时         , 如果管道缓冲区为空或者没有缓冲区      , 那么当前协程就会阻塞                   , 然后放入 recvq 队列中      。

往管道写入数据时            ,如果管道缓冲区为空或者缓冲区满了   ,那么当前协程就会阻塞                   , 然后放入 sendq 队列中          。

读阻塞的协程会被新来的写数据的协程唤醒                  。

写阻塞的协程会被新来的读数据的协程唤醒         。

同时上述数据结构中                , 我们可以看到一个管道中只能传递一种元素类型       。如果想数据类型动态化, 可以传递 interface                  。

管道的操作:

初始化有两种方式:

变量声明:

varchchanint//声明一个新的管道

使用 make:

ch1:= make(chan string) // 无缓冲管道ch1:=make(chanstring3) // 有缓冲管道

管道的读写是通过操作符: 「<-」控制的               ,管道在左边表示把右侧数据写入到管道中                   , 管道在右边表示读取管道数据赋值给左侧变量            。

ch1:=make(chanstring) // 初始化ch1<-"gjl";//把gjl字符串写入到管道中c:=<-ch1;//读取管道数据并交给c变量fmt.Println(c) // 输出

同时也可以通过操作符来限制管道的读写权限    。

举个栗子?:

funcChanRW(chchanint){ // 可以读写}funcChanR(ch<-chanint){//仅可以读}funcChanW(chchan<-int){ // 仅可以写}

注意:对于值为 nil 的管道   , 无论读写都会使协程永久阻塞                   。

最后我们具体看一下管道发送和接收时的处理流程图            ,用 processon 简单画一下图(最近沉迷练习画图 - -):

发送:

接收:

如果您在实际开发过程中遇到过 Python            、数据库                   、爬虫      、分布式         、消息队列等方面的难题                   , 也欢迎在公众号或评论区留言      , 我们一起探讨解决方案

如果本篇内容能够帮助到您, 希望您关注我的公众号: 「python 学习爱好者」         , 希望与您一起共同成长~

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
网站排名的优化(如何快速优化SEO排名,提升网站曝光率) 语义分割IOU的计算(搭建自己的语义分割平台deeplabV3+)