golang——gorountine+channel

  1. 基本使用
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()
}

快速知识点

  1. 每开启一个协程之前wg.Add(1),方法结束之后wg.Done()
  2. 当多个协程对同一个管道进行写入和读出的操作时,读出很快但是会等待写入完成
  3. 管道如果要用range进行遍历,则需要将管道关闭Close(),否则会报deadclock死锁错误,如果用for进行遍历不会出错但是建议还是要将管道关闭
  4. 被关闭的管道是可以被读的但是不能被写入
  5. 主线程比协程执行要快,所以需要设置wg.Wait()进行等待
  1. 单向通道
//单向通道,只能读
ch1 := make(<-chan int ,3)
//只能写
ch2 := make(chan<- int, 3)
  1. 多路复用
for{select {case v:= <-intChan:fmt.Println(v)case v:= <-stringChan:fmt.Println(v)default:fmt.Println("读取完毕")return }
}

多路复用的时候不需要关闭管道

  1. 解决协程出现的Panic
//需要recover()宕机恢复,并且返回异常,只能在defer函数中调用
defer func(){if err := recover();err!=nuil{fmt.Println("出问题啦")}
}()

golang——gorountine+channal相关推荐

  1. Golang学习+深入(十三)-goroutine/channal

    目录 一.goroutine(协程) 1.goroutine 2.MPG模式(goroutine的调度模型) 3.设置Golang运行的cpu数 4.资源争抢 4.1.全局互斥锁解决资源竞争 二.ch ...

  2. golang mysql加锁_使用golang实现类InnoDB数据行锁效果

    在关系型数据库领域,为人津津乐道的一个特性,便是数据库的锁设计及事务隔离级别. 本文通过golang系统库sync,来实现简单的数据库数据读写操作. 场景说明 小明经营一家水果店,创业初始资金为100 ...

  3. Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践

    博文作者:迦壹 博客地址:Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! 1.Ra ...

  4. Golang 协程顺序打印

    Golang 协程顺序打印 A.B 两个协程分别打印 1.2.3.4 和 A,B,C,D 实现:定义 A.B 两个 channal,开 A.B 两个协程,A 协程输出[1, 2, 3, 4].B 协程 ...

  5. Golang#Typora-Golang笔记

    知名编程语言或系统的发展简史 一.B语言 B语言之父:Ken Thompson(肯.汤普森).B语言是贝尔实验室开发的一种通用的程序设计语言,它是于1969年前后Ken Thompson(肯.汤普森) ...

  6. golang语言并发与并行——goroutine和channel的详细理解

    转载自: http://blog.csdn.net/skh2015java/article/details/60330785 http://blog.csdn.net/skh2015java/arti ...

  7. golang all goroutines are asleep - deadlock

    问题: 今天在写golang程序的时候,出现了一个错误:all goroutines are asleep - deadlock! 代码如下: package mainimport ("fm ...

  8. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  9. 基于Golang的简单web服务程序开发——CloudGo

    基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...

  10. CentOS Docker安装配置部署Golang web helloworld

    目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker部署Golang web helloworld 四.Docker与虚拟机的区别 五. ...

最新文章

  1. mysql数据库数据恢复_Mysql数据库delete删除后数据恢复报告
  2. 智慧城市不是“交钥匙”工程 信息技术是根本
  3. [骗分技巧——随机化Ⅰ]CodeChef-Milestones,CF364D-Ghd
  4. c51编程语言基础习题,《单片机基础》练习题及答案
  5. 运行shell脚本时怎么知道jdk路径_Shell写脚本关于ssh执行jar包,需要刷新JDK路径的问题...
  6. 有时候,996确实会让你麻木
  7. [译]IIS 8.0应用初始化
  8. java 常用习惯用法总结
  9. Android音视频系列(七):PCM音频单声道与双声道的相互转换
  10. 总结js实现字符串转JSON对象的几种方法
  11. 第一行代码android网课,使用Mongodb实现打卡签到系统的实例代码
  12. fastlane二开java_Fastlane 使用手册(二)
  13. PostgreSQL之外键约束
  14. 情商比智商更能决定人的一生
  15. JavaScript ES5
  16. 罗克韦尔AB PLC RSLogix模拟量IO模块基本介绍
  17. android来电电话获取,Android获取来电号码代码
  18. 微信微网站的服务器ip地址查询,微信开发之(三)获取微信服务器IP地址
  19. 一个33岁资深自媒体人的思维
  20. 联想E540笔记本电脑拆键盘、换键盘

热门文章

  1. 系统管理、系统安全命令
  2. hdu 6438 - 贪心
  3. 通讯与计算机网络在线作业,浙大秋通讯与计算机网络在线作业试题及答案
  4. oracle11g闪回默认路径,rman 备份默认路径小结
  5. 深度复数网络 Deep Complex Networks
  6. 企业萤石云服务器,企业萤石云提供DIY轻量级场景,助力打造商业智居轻方案
  7. AV1编码器优化技术
  8. java学习第一步-工欲善其事必先利其器
  9. 2021-08-02复习总结mysql的杂七杂八
  10. 理解Intel cpufreq intel_pstate driver的工作模式