返回顶部
首页 > 资讯 > 精选 >Go通道channel怎么通过通信共享内存
  • 586
分享到

Go通道channel怎么通过通信共享内存

2023-07-02 15:07:55 586人浏览 独家记忆
摘要

本文小编为大家详细介绍“Go通道channel怎么通过通信共享内存”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go通道channel怎么通过通信共享内存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。引言不要通

本文小编为大家详细介绍“Go通道channel怎么通过通信共享内存”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go通道channel怎么通过通信共享内存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

引言

不要通过共享内存来通信 应该通过通信来共享内存

这句话有网友的解释如下:

这句俏皮话具体说来就是,不同的线程不共享内存不用,线程之间通讯用通道(channel)同步也用channel。

chanel是协程之间传递信息的媒介,优雅地解决了某些后端开发常用语言中随处可见的lock,unlock,临界区等,把从很多线程层面解决的问题移到协程,从而静态地保证没有数据竞争。

通道的声明与创建

伪代码如下:

//声明类型var 通道名 chan 数据类型//创建通道通道名 = make(chan 数据类型)

实际例子如下:

package mainimport "fmt"func main() {    var a chan int    fmt.Printf("%T, %v\n", a, a)    if a == nil {        a = make(chan int)        fmt.Printf("%T, %v\n", a, a)    }}

运行结果是:

chan int, <nil>
chan int, 0x1400001a360

通道是一个内存地址,这也说明了其实一个引用类型的数据。

接收 & 发送数据

对于同一个通道来讲,他的读数据 和 写数据 都是阻塞的。
伪代码如下:

//从通道读数据data := <-a//把数据写入通道a <- data

实际例子如下:

package mainimport "fmt"func main() {    //    首先创建一个bool类型的通道    var ch2 chan bool    ch2 = make(chan bool)    //下面启动一个go routine    go func() {        for i := 0; i &lt; 10; i++ {            fmt.Println("子goroutine中, i: ", i)        }        fmt.Println("completed")        //循环结束后 向团队中写数据,表示要结束了        ch2 &lt;- true    }()    //在主程序中读取数据    data := &lt;-ch2    //打印一下 我们读到的数据    fmt.Println("main  data: ", data)    fmt.Println("main goroutine completed")}

运行结果如下:

子goroutine中, i: 0
子goroutine中, i: 1
子goroutine中, i: 2
子goroutine中, i: 3
子goroutine中, i: 4
子goroutine中, i: 5
子goroutine中, i: 6
子goroutine中, i: 7
子goroutine中, i: 8
子goroutine中, i: 9
completed
main data: true
main goroutine completed

我们的子goroutine里面 循环打印1~10, 打印完成之后 把chanel类型的ch2写为true,
这时候,主goroutine就可以根据这一条件进行下一步了,,在此之前,其实就算主goroutine先抢到了资源,从ch2中读取数据,但是现在通道里面啥都没有,只能阻塞,然后乖乖交出资源给我们的子goroutine,直到循环结束写true入ch2。

需要注意的有以下几点:

  • chanel是需要指定类型的 nil类型的chanel不能直接使用。

  • chanel本身是同步的,同一时间只能有一条goroutine进行操作。

  • chanel是goroutine之间传递数据用的,chanel数据的发送和接收必须在不同的goroutine中,如果只有一条goroutine是用不上chanel的,这种情况会发生死锁(deadLock)。

  • 从chanel里面读数据立马就会被阻塞,直到有向chanel写数据的goroutine来。

  • 向chanel里面写数据立马就会被阻塞,直到有从chanel读数据的goroutine来。

(以上都是相对于没有缓存的通道而言,后面讲到的缓存通道在缓冲区满的时候才阻塞,而不是立刻阻塞)

读到这里,这篇“Go通道channel怎么通过通信共享内存”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Go通道channel怎么通过通信共享内存

本文链接: https://lsjlt.com/news/342781.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go通道channel通过通信共享内存
    目录引言通道的声明与创建接收 & 发送数据引言 不要通过共享内存来通信 应该通过通信来共享内存 这句话有网友的解释如下: 这句俏皮话具体说来就是,不同的线程不共享内存不用锁,...
    99+
    2024-04-02
  • Go通道channel怎么通过通信共享内存
    本文小编为大家详细介绍“Go通道channel怎么通过通信共享内存”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go通道channel怎么通过通信共享内存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。引言不要通...
    99+
    2023-07-02
  • python怎么共享内存通信
    在Python中,可以使用多种方式来实现进程间的共享内存通信,下面是一些常用的方法: 使用`multiprocessing`模块中...
    99+
    2023-10-25
    python
  • 【Linux从入门到精通】通信 | 共享内存(System V)
        本篇文章接着上篇文章通信 | 管道通信(匿名管道 & 命名管道)进行讲解。本篇文章的中点内容是共享内存。 文章目录  一、初识与创建共享内存 1、1 什么是共享内存 1、2 共享内存函数 1、2、1 创建共享内存 ...
    99+
    2023-10-01
    linux 运维 通信 共享内存
  • Python进程间通信之共享内存
    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现。查了一下,Python中可以使用mmap模块来...
    99+
    2023-01-31
    进程 内存 通信
  • 怎么在c#中通过内存映射共享文件
    本篇文章给大家分享的是有关怎么在c#中通过内存映射共享文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。App1代码:using System;using ...
    99+
    2023-06-14
  • Python进程间通信之共享内存详解
    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现。查了一下,Python...
    99+
    2022-06-04
    详解 进程 内存
  • C#.Net通信共享内存映射文件是什么
    这篇文章主要讲解了“C#.Net通信共享内存映射文件是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#.Net通信共享内存映射文件是什么”吧!节点通信存在两种模型:共享内存(Share...
    99+
    2023-06-30
  • 管道、套接字和共享内存:进程通信的秘密武器
    管道 管道是一种半双工通信机制,它允许两个相关进程在同一主机上进行通信。管道创建时,会建立一个缓冲区,用于存储进程之间交换的数据。写入进程将数据写入缓冲区,而读取进程从缓冲区中读取数据。管道具有以下特点: 专用且高效,仅限于相关进程使用...
    99+
    2024-04-02
  • node 利用进程通信实现Cluster共享内存
    Node.js的标准API没有提供进程共享内存,然而通过IPC接口的send方法和对message事件的监听,就可以实现一个多进程之间的协同机制,通过通信来操作共享内存。 ##IPC的基本用法: //...
    99+
    2022-06-04
    进程 内存 通信
  • php进程通信之共享内存详细讲解
    目录常见进程通信方式system V共享内存php使用共享内存共享内存基本函数使用父子进程通信配合信号量使用非血缘关系进程共享内存通信共享内存的特性常见进程通信方式 system ...
    99+
    2024-04-02
  • node中怎么利用进程通信实现Cluster共享内存
    node中怎么利用进程通信实现Cluster共享内存,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。##IPC的基本用法:// w...
    99+
    2024-04-02
  • golang函数如何通过管道共享数据
    管道是 go 语言中用于在 goroutine 之间共享数据的通信机制。可以通过 make(chan type) 函数创建管道,它有读写端。以下示例函数通过管道共享数据,将两个数字相加并...
    99+
    2024-05-03
    管道 共享数据 golang
  • .Net多进程通信共享内存映射文件Memory Mapped
    目录内存映射文件究竟是个什么?.Net 共享内存 内存映射文件原理.Net 共享内存 演示代码.Net 进程间通信共享内存IMServer_Message.exe 代码IMServe...
    99+
    2024-04-02
  • 【Linux】进程间通信(万字详解)—— 匿名管道 | 命名管道 | System V | 共享内存
    🌈欢迎来到Linux专栏~~进程通信 ...
    99+
    2023-08-22
    linux 服务器 unix
  • c# 通过内存映射实现文件共享内存的示例代码
    目录App1代码:App2代码:App3代码:内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用c语言的 mem...
    99+
    2024-04-02
  • Linux之进程间通信(共享内存【mmap实现+系统V】)
    目录共享内存mmap()及其相关的系统调用mmap()munmap()共享内存的使用命令管理共享内存总结共享内存 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,两个不同的进程A、B共享内存的意思就是:同一...
    99+
    2023-03-23
    Linux进程间通信 Linux共享内存 Linux进程
  • Oracle Study之案例--通过IPCS查看共享内存之“怪现象”
    Oracle Study之案例--通过IPCS查看共享内存之“怪现象”          在Oracle 11gR2环境下,通过ipcs命令查看共...
    99+
    2024-04-02
  • WebLogic中怎么通过数据库配置Session共享
    这篇文章将为大家详细讲解有关WebLogic中怎么通过数据库配置Session共享,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。    ...
    99+
    2024-04-02
  • html5怎么通过postMessage进行跨域通信
    本篇内容主要讲解“html5怎么通过postMessage进行跨域通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5怎么通过postMessage进行...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作