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. 微服务部署:蓝绿部署、滚动部署、灰度发布等部署方案对比与总结
  2. WIN10 OpenGL GLFW+GLAD 开发环境搭建
  3. Spring Boot 内置Tomcat——集成PHP解决方案
  4. java log4j 写日志_Java log4j同时写入文本日志和数据库日志
  5. C++ Primer 第10章 习题10.24
  6. SQLAlchemy ORM教程之三:Relationship
  7. 计算机会计学ufo报表,UFO报表管理实验报告.doc
  8. 根据网卡MAC地址查询厂商信息
  9. 兴东机器人_福州市松下机器人维保中心
  10. 一般现在时,主语为第三人称单数,例句说明
  11. python生成微信小程序码
  12. qcon2016_从QCon San Francisco 2016中学到的重点知识和教训
  13. Flow-3D二次开发入门 教程
  14. 常见的积分商城游戏类型有哪些?
  15. 如何找出zeppelin的登入帳號密碼?
  16. java runnable执行完_java – 如何停止Runnable计划在一定数量的执行后重复执行
  17. 热插拔机制之udev和mdev
  18. 电化学传感器使用-电子学角度分析
  19. 计算机英语统考试卷分析,英语试卷分析
  20. mysql如何做直播_如何做好直播?

热门文章

  1. 超级好用的 excel 导入导出框架:excel-import-export
  2. 110 Ruby 版本管理器【Rails后端开发训练营】
  3. 开发管理---项目的范围、时间与成本
  4. 全选、反选、获取选中值
  5. Delphi 仿QQ皮肤控件设计与运行效果图
  6. 假设有一张纸可对折无限次,它的厚度为0.1毫米,珠穆朗玛峰的高度为8848.86米,求这张纸对折多少次后它的厚度会超过珠峰的高度。
  7. mfc100u.dll丢失的解决方法
  8. 使用python3开发趴小说的小工具
  9. 渗透测试员完整职业指南
  10. Focal Loss讲解