golang——gorountine+channal
golang——gorountine+channel
- 基本使用
package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc putNum(intChan chan int) {for i := 1; i <= 200; i++ {intChan <- i}close(intChan)wg.Done()
}func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {for num := range intChan {flag := trueif num != 1 {for i := 2; i < num; i++ {if num%i == 0 {flag = falsebreak}}if flag {primeChan <- num}}}exitChan <- truewg.Done()
}func printPrime(primeChan chan int) {for v := range primeChan {fmt.Println("素数是:", v)}wg.Done()
}func main() {intChan := make(chan int, 200)primeChan := make(chan int, 200)exitChan := make(chan bool, 16)wg.Add(1)go putNum(intChan)for i := 0; i < 16; i++ {wg.Add(1)go primeNum(intChan, primeChan, exitChan)}wg.Add(1)go printPrime(primeChan)wg.Add(1)go func() {for i := 0; i < 16; i++ {<-exitChan}close(primeChan)wg.Done()}() //匿名执行函数wg.Wait()
}
快速知识点
- 每开启一个协程之前wg.Add(1),方法结束之后wg.Done()
- 当多个协程对同一个管道进行写入和读出的操作时,读出很快但是会等待写入完成
- 管道如果要用range进行遍历,则需要将管道关闭Close(),否则会报deadclock死锁错误,如果用for进行遍历不会出错但是建议还是要将管道关闭
- 被关闭的管道是可以被读的但是不能被写入
- 主线程比协程执行要快,所以需要设置wg.Wait()进行等待
- 单向通道
//单向通道,只能读
ch1 := make(<-chan int ,3)
//只能写
ch2 := make(chan<- int, 3)
- 多路复用
for{select {case v:= <-intChan:fmt.Println(v)case v:= <-stringChan:fmt.Println(v)default:fmt.Println("读取完毕")return }
}
多路复用的时候不需要关闭管道
- 解决协程出现的Panic
//需要recover()宕机恢复,并且返回异常,只能在defer函数中调用
defer func(){if err := recover();err!=nuil{fmt.Println("出问题啦")}
}()
golang——gorountine+channal相关推荐
- Golang学习+深入(十三)-goroutine/channal
目录 一.goroutine(协程) 1.goroutine 2.MPG模式(goroutine的调度模型) 3.设置Golang运行的cpu数 4.资源争抢 4.1.全局互斥锁解决资源竞争 二.ch ...
- golang mysql加锁_使用golang实现类InnoDB数据行锁效果
在关系型数据库领域,为人津津乐道的一个特性,便是数据库的锁设计及事务隔离级别. 本文通过golang系统库sync,来实现简单的数据库数据读写操作. 场景说明 小明经营一家水果店,创业初始资金为100 ...
- Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践
博文作者:迦壹 博客地址:Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! 1.Ra ...
- Golang 协程顺序打印
Golang 协程顺序打印 A.B 两个协程分别打印 1.2.3.4 和 A,B,C,D 实现:定义 A.B 两个 channal,开 A.B 两个协程,A 协程输出[1, 2, 3, 4].B 协程 ...
- Golang#Typora-Golang笔记
知名编程语言或系统的发展简史 一.B语言 B语言之父:Ken Thompson(肯.汤普森).B语言是贝尔实验室开发的一种通用的程序设计语言,它是于1969年前后Ken Thompson(肯.汤普森) ...
- golang语言并发与并行——goroutine和channel的详细理解
转载自: http://blog.csdn.net/skh2015java/article/details/60330785 http://blog.csdn.net/skh2015java/arti ...
- golang all goroutines are asleep - deadlock
问题: 今天在写golang程序的时候,出现了一个错误:all goroutines are asleep - deadlock! 代码如下: package mainimport ("fm ...
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- 基于Golang的简单web服务程序开发——CloudGo
基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...
- CentOS Docker安装配置部署Golang web helloworld
目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker部署Golang web helloworld 四.Docker与虚拟机的区别 五. ...
最新文章
- mysql数据库数据恢复_Mysql数据库delete删除后数据恢复报告
- 智慧城市不是“交钥匙”工程 信息技术是根本
- [骗分技巧——随机化Ⅰ]CodeChef-Milestones,CF364D-Ghd
- c51编程语言基础习题,《单片机基础》练习题及答案
- 运行shell脚本时怎么知道jdk路径_Shell写脚本关于ssh执行jar包,需要刷新JDK路径的问题...
- 有时候,996确实会让你麻木
- [译]IIS 8.0应用初始化
- java 常用习惯用法总结
- Android音视频系列(七):PCM音频单声道与双声道的相互转换
- 总结js实现字符串转JSON对象的几种方法
- 第一行代码android网课,使用Mongodb实现打卡签到系统的实例代码
- fastlane二开java_Fastlane 使用手册(二)
- PostgreSQL之外键约束
- 情商比智商更能决定人的一生
- JavaScript ES5
- 罗克韦尔AB PLC RSLogix模拟量IO模块基本介绍
- android来电电话获取,Android获取来电号码代码
- 微信微网站的服务器ip地址查询,微信开发之(三)获取微信服务器IP地址
- 一个33岁资深自媒体人的思维
- 联想E540笔记本电脑拆键盘、换键盘