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