Golang 协程配合管道的实现示例

 更新时间:2024年01月11日 11:09:35   作者:富士康质检员张全蛋  
本文主要介绍了Golang协程配合管道的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

请完成goroutine和channel协同工作的案例,具体要求:
(1)开启一个writeData协程,向管道mtChan中写入50个整数.
(2)开启一个readData协程,从管道intChan中读取writeData写入的数据。
(3)注意:writeData和readDate操作的是同一个管道
(4)主线程需要等待writeData和readDate协程都完成工作才能退出(如果主线程不做处理,那么其他线程还没干完活就直接跑路了)

管道是引用类型,那么写入读取的都是同一个管道,也就是在不同函数不同栈里面读取的都是同一个管道。两个协程同时的向管道里面写入读取数据,而不是一个写完另外一个协程再去读取。

package main

import (
	"fmt"
)

func writeData(initChan chan int) {
	for i := 0; i <= 50; i++ {
		//放入数据
		initChan <- i
		fmt.Println("write data:", i)
	}
	close(initChan)
}
func readData(initChan chan int, exitChan chan bool) {
	//即使管道close之后并不影响读取,当在管道当中取不到数据才会退出
	for {
		//在从一个管道里面读取会返回两个值,ok是有没有正确读取到
		v, ok := <-initChan
		if !ok {
			break
		}
		fmt.Println("read data:", v)
	}
	//readData任务完成之后
	exitChan <- true
	close(exitChan)
}

func main() {
	//创建两个管道
	initChan := make(chan int, 50)
	exitChan := make(chan bool, 1)

	go writeData(initChan)
	go readData(initChan, exitChan)

	for {
		_, ok := <-exitChan
		fmt.Println("ok=", ok)
		if ok {
			break
		}
	}
}

如果给的容量就是50,那么循环50次就刚好放进去了。如果管道和放进去的数据量不匹配,管道的容量小于放进去的数据,又不取出来,那么它就会阻塞,就会死锁。

这个管道可以容纳的数据量很小,要写的数据量很大,只要一边在写,另外一边在读是无所谓的。

如果写的快,读取的慢。那么在写的时候就会阻塞,编译器会发现虽然阻塞了,但是有另外一个协程在往里面读取数据,这样就不会发生死锁。

func producer(ch chan int) {
	i := 0
	for {
		ch <- i
		i++
	}
}

func main() {
	ch := make(chan int, 2)
	go producer(ch)

	for {
		fmt.Println(<-ch)
		time.Sleep(time.Second * 2)
	}
}

0
1
2
3
4
5
6
7

进程 已完成,退出代码为 -1073741510 (0xC000013A: interrupted by Ctrl+C)

死锁编译器底层会分析,如果发现一个地方在不停的写,但是没有任何一个协程去读取这样就直接死锁,如果有一个协程在慢慢的读取这样不会死锁。和写入读取速度没有关系,但是必须有写入的协程和读取的协程。简而言之就是管道需要不停的流动。

到此这篇关于Golang 协程配合管道的文章就介绍到这了,更多相关Golang 协程配合管道内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你使用Golang实现SSH客户端

    一文带你使用Golang实现SSH客户端

    SSH 全称为 Secure Shell,是一种用于安全地远程登录到网络上的其他计算机的网络协议,本文主要为大家详细介绍了如何使用 Golang 实现 SSH 客户端,需要的可以参考下
    2023-11-11
  • Goland的设置与配置全过程

    Goland的设置与配置全过程

    这篇文章主要介绍了Goland的设置与配置全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 详解Go内存模型

    详解Go内存模型

    这篇文章主要介绍了Go 内存模型的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Golang常用环境变量说明与设置详解

    Golang常用环境变量说明与设置详解

    这篇文章主要介绍了Golang常用环境变量说明与设置,需要的朋友可以参考下
    2020-02-02
  • 基于Golang实现Excel表格的导入导出功能

    基于Golang实现Excel表格的导入导出功能

    最近项目开发中有涉及到Excel的导入与导出功能,特别是导出表格时需要特定的格式,所以本文给大家介绍了基于Golang实现Excel表格的导入导出功能,文中通过代码示例和图文介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • go语言中的defer关键字

    go语言中的defer关键字

    这篇文章介绍了go语言中的defer关键字,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Golang实现Md5校验的代码示例

    Golang实现Md5校验的代码示例

    最近项目中有个需求,就是地图文件下发后,接收方需要文件的md5值,和接收到的文件做比对,以免文件不完整,引起bug,于是测试了下本地文件和远程文件的md5计算,所以本文给大家介绍了Golang实现Md5校验,需要的朋友可以参考下
    2024-07-07
  • Go 模块在下游服务抖动恢复后CPU占用无法恢复原因

    Go 模块在下游服务抖动恢复后CPU占用无法恢复原因

    这篇文章主要为大家介绍了Go 模块在下游服务抖动恢复后CPU占用无法恢复原因详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 一文了解Go语言中的函数与方法的用法

    一文了解Go语言中的函数与方法的用法

    与大部分语言一致,Go语言中的函数与方法定义与其他语言基本一致,但也有一定的差别。本文将通过示例详细讲讲Go语言中函数与方法的用法,感兴趣的可以学习一下
    2022-07-07
  • Golang使用pprof检查内存泄漏的全过程

    Golang使用pprof检查内存泄漏的全过程

    pprof 是golang提供的一款分析工具,可以分析CPU,内存的使用情况,本篇文章关注它在分析内存泄漏方面的应用,本文给大家介绍了Golang使用pprof检查内存泄漏的全过程,文中通过代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-02-02

最新评论