Loading

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类型数据

 

posted @ 2024-10-11 13:31  Carver大脸猫  阅读(34)  评论(0)    收藏  举报