Go语言快速入门笔记(4)--协程并发go关键字,通道chan,select语句

协程并发go关键字

  • 协程是什么
    协程,又称微线程,纤程。英文名Coroutine。相比于线程(8M左右),协程(4K左右)占用的空间很小,同时并发协程数可以没有上限(只要内存足够),而并发线程数受制于操作系统,因此协程更适合高并发环境。

  • 开启协程

    	go fun()	//fun为需要协程启动的函数
    
  • 设置并发调用的逻辑CPU核心数

    	func init(){
    		//设置程序最大可用CPU数量为机器的最大逻辑核心数
    		runtime.GOMAXPROCS(runtime.NumCPU())	
    	}
    

    注意:init函数和main函数相同,在main函数被调用前执行

协程间通信-通道chan

  • chan声明
	chl := make(chan datetype)	//无缓冲区通道
	chl := make(chan datetype, 缓冲区长度)	  //带缓冲区通道
	chl := make(<- chan datetype[, 缓冲区长度]) 	//只读通道
	chl := make(chan <- datetype[, 缓冲区长度]) 	//只写通道
  • 向通道写入数据
	chl <- 数据
  • 从通道中读取数据并保存在变量中
	方法1:变量 := <- chl
	方法2:变量,ok := <- chl	//ok表示通道是否关闭
	方法3for value := range chl{	//for-range读取数据,直到通道关闭
		//循环操作
	}
  • 通道的关闭
	close(chl)

注意:

  1. 通道是阻塞式的,协程从中读取/写入数据,除非通道中存在数据/缓冲区未满,否则对该通道进行IO操作的协程阻塞
  2. 无缓冲区通道可认为是有一个单位容量的带缓冲区通道
  3. 只读/只写通道多数时候用于函数传参,控制通道的读写,例如
	func read(chl <- chan string){
		<- chl
	}
	func write(chl chan <- string, data string){
		chl <- data
	}
	func main{
		chl := make(chan string, 10)
		write(chl, "hello")
		read(chl)
	}
  1. 通道是协程安全的,内部互斥锁保证同一时刻只有一个协程对通道进行操作

select语句

  • 用法
	select {
	case 通道IO操作语句:	...	
	case 通道IO操作语句:	...	
	default:...
	}

注意:select和switch语句类似,但case后接chan的IO语句,程序选择一个IO语句非阻塞的case分支执行,若都阻塞则转default分支

Go语言快速入门笔记系列传送门

Go语言快速入门笔记(1)–变量var,分支if else,循环for,fmt简单输入输出

Go语言快速入门笔记(2)–值类型和引用类型,silce切片,map映射

Go语言快速入门笔记(3)–函数,指针,srtuct结构体,interface接口,Error错误,panic恐慌和recover恢复

Go语言快速入门笔记(4)–协程并发go关键字,通道chan,select语句

Go语言快速入门笔记(5)–PV原语简介,sync包实现互斥与同步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值