Golang channel【管道】和goroutine的理解及优缺点

一:不同 goroutine 之间如何通讯

  • 全局变量加互斥锁同步【低水平】
    package main
    
    import (
    	"fmt"
    	"sync"
    	"time"
    )
    
    var (
    	myMap = make(map[int]int, 10)
    	//声明一个全局的互斥锁
    	lock sync.Mutex //lock 是一个全局的互斥锁  sync 是一个同步的包  Mutex 是互斥
    )
    
    func test(n int) {
    	res := 1
    	for i := 1; i <= n; i++ {
    		res *= i
    	}
    	//我们将res放入到myMap中
    	//加锁
    	lock.Lock()
    	myMap[n] = res // concurrent map writes
    	//解锁
    	lock.Unlock()
    }
    
    func main() {
    	//开启多个协程完成这个任务[200个]
    	for i := 0; i <= 200; i++ {
    		go test(i)
    	}
    	//休眠10秒钟
    	time.Sleep(time.Second * 10)
    	//输出结果
    	lock.Lock()
    	for i, v := range myMap {
    		fmt.Printf("map[%d]=%d\n", i, v)
    	}
    	lock.Unlock()
    }
    
  • channel【高水平】

二:为什么使用channel

  • 主线程在等待所有的goroutine全部完成的时间很难确定,随机设置时间仅仅是估算 
  • 如果主线程休眠时间太长了,会加长等待时间,如果等待时间短了,可能还有goroutine处于工作状态,这时也会随主线程的退出而销毁
  • 通过全局变量加锁同步实现通讯,也并不利于多个协程对全局变量的读写操作

三:channel的基本介绍

  • channel本质就是一个数据结构【队列-先进先出】
  • 多个gorontine访问时,不需要加锁【channel本身就是线程安全的】
  • channel 有类型的,一个string的channel只能存放string类型数据

 

作者:Carver-大脸猫

出处:https://www.cnblogs.com/carver/articles/18458172

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请注明原处

posted @   Carver-大脸猫  阅读(16)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题