golang开发:channel使用
channel主要是用于多个goroutine之间通信
channel语法
channel是引用类型,需要实用make来创建channel,如下
make(chan Type, [buffer])
chan Type 通道的类型
buffer 是可选参数,代表通道缓冲区的大小(省略则代表无缓冲)
向channel里面写入数据使用 <- 符号
q := make(chan bool)
q<-true
从channel里面读取数据也是使用 <- 符号,只不过写入的channel在右边,读取的时候channel在左边。意思跟方向是一致的,一个是数据进入channel,一个是数据从channel出去
q := make(chan bool)
<-q
有缓冲channel的使用
我们一直使用的无缓冲的channel,今天主要学习下有缓存的channel。
无缓冲的channel,写入数据后一定要有goroutine 从channel读取数据后再写入,否则程序会panic。
func main() {
ch := make(chan int)
ch<-1
}
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
有缓冲的channel,可以写入缓冲大小个数据,可以没有goroutine从channel读取。
func main() {
ch := make(chan int,2)
ch<-1
ch<-2
}
Process finished with exit code 0
执行结果跟预期是一致的。
有缓冲大小的channel使用场景
假如我们有一个任务需要10个goroutine去调度执行,只要有一个goroutine执行完毕,调度就应该结束。我们看下伪代码
func test(wg *sync.WaitGroup,ch chan int,i int) {
fmt.Println("test code")
ch<-i
}
func main() {
fmt.Println("start",runtime.NumGoroutine())
ch := make(chan int)
wg := new(sync.WaitGroup)
for i:=0;i<10;i++ {
wg.Add(1)
go test(wg,ch,i)
}
fmt.Println(<-ch)
fmt.Println("end",runtime.NumGoroutine())
wg.Done()
}
start 1
test code
9
end 10
从执行结果上看,是第9个goroutine首先执行完毕了。程序也正常退出了。但是我们看到,加上主goroutine,内存中一共有11个goroutine,程序退出的时候还有10个goroutine,减去一个主goroutine,还有9个goroutine没有退出,这个对程序来说是不允许,可能会泄漏或者长期占用资源不释放。
但是我们如果使用了有缓冲的channel,就可以利用channel的缓冲机制正常退出全部的goroutine了。
看下代码
func test(wg *sync.WaitGroup,ch chan int,i int) {
ch<-i
}
func main() {
fmt.Println("start",runtime.NumGoroutine())
ch := make(chan int, 10)
wg := new(sync.WaitGroup)
for i:=0;i<10;i++ {
wg.Add(1)
go test(wg,ch,i)
}
fmt.Println(<-ch,"success")
for i:= 0;i<9;i++ {
fmt.Println(<-ch)
}
fmt.Println("end",runtime.NumGoroutine())
wg.Done()
}
start 1
0 success
1
2
4
3
5
6
7
8
9
end 1
Process finished with exit code 0
打印success的时候,第一个goroutine已经将任务完成,循环9次将channel里面的数据读取出来,保证创建的goroutine都不会阻塞能够正常退出来。
golang开发:channel使用的更多相关文章
- 用golang开发系统软件的一些细节
用golang开发系统软件的一些细节 作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 (本文的pdf版本) ...
- 使用golang 开发的 andriod应用
最近在捣鼓一个东东,就是使用golang开发andriod应用.说起来简单操作起来还挺麻烦,中间又学习了很多东西.比如ubuntu,docker,angular,ionic,jquery mobile ...
- golang开发android环境搭建_window
golang开发android环境搭建介绍 一 安装依赖软件: git:版本管理 go: go开发环境(版本>=1.5),可直接下载window版的go安装包. android studio: ...
- Windows下visual studio code搭建golang开发环境
Windows下visual studio code搭建golang开发环境 序幕 其实环境搭建没什么难的,但是遇到一些问题,主要是有些网站资源访问不了(如:golang.org),导致一些包无法安装 ...
- golang的Channel
golang的Channel Channel 是 golang 一个非常重要的概念,如果你是刚开始使用 golang 的开发者,你可能还没有真正接触这一概念,本篇我们将分析 golang 的Chann ...
- linux golang开发环境配置(离线方式)
<获取开发工具> 到https://www.golangtc.com/download 下载安装包, 根据自己的系统选择合适的开发包,这里选择go.1.9.2.linux-amd6 ...
- miniblink+golang开发windows gui应用
golang的优点自不必说了,这么好的语言怎么能缺少界面库呢?所以我使用miniblink开发了一个可以用html,css,js开发界面的浏览器,通过它你能为你的golang开发简单的界面.说白了其实 ...
- Linux下golang开发环境搭建
对于golang开发来说,Windows下可以用vscode或者liteide都不错,但是Linux下的开发也就只有vim了,所以怎么搞笑的利用vim进行golang开发呢? 参考官方推荐的一个插件: ...
- window / Linux 下 Golang 开发环境的配置
一直专注于使用python语言进行程序开发,但是却又一直被它的性能问题所困扰,直到遇到了天生支持高并发的Golang,这似乎也成了学习go语言最理所当然的理由.下面介绍下Go语言开发环境搭建的步骤: ...
随机推荐
- Java类库以及它的基本组织结构
Java 类库概念: Java 的应用程序编程接口 (API (Application Programming Interface) )以包的形式来组织,每个包提供了大量的相关类.接口和异常处理类, ...
- FlashFXP免费版下载
http://www.wocaoseo.com/thread-294-1-1.html 关于互联网的上传下载软件可能有很多种,也有很多安装后免费使用的软件比如8UFTP等,但如果论起速度和功能性,个人 ...
- Struts+Servlet+JDBC网上手机销售系统
项目描述 Hi,大家好,今天给大家分享一个<网上手机销售系统>.本系统一共分为前台和后台两大模块,两个模块之间虽然在表面上是相互独立的,但是在对数据库的访问上是紧密相连的,各个模块访问的是 ...
- 8个必备的Python GUI库
Python GUI 库有很多,下面给大家罗列常用的几种 GUI 库.下面介绍的这些GUI框架,能满足大部分开发人员的需要,你可以根据自己的需求,选择合适的GUI库. 很多人学习python,不知道从 ...
- rabbitmq集成和实战
与 Spring 集成 pom 文件 使用 Maven,这里使用的 4.3.11,所以这里引入的是 rabbit 是 2.0.0,如果兼容性的话请自行去 Spring 的官网上去查 这里补充一下,sp ...
- 基础Html重点——防健忘
一.head标签重点 <head> <meta charset="utf-8"> <title>第二天课</title> <! ...
- leetcode刷题-58最后一个单词
题目 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度.如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词. 如果不存在最后一个单词,请返回 0 . 说明:一 ...
- roarctf_2019_easy_pwn
这篇博客主要记录当直接在malloc_hook中直接写入one_gadget不起作用时的一些处理方法.题目附件:https://buuoj.cn/challenges#roarctf_2019_eas ...
- Nice to meet you
Who am i 详情可以参见我的这一篇博文 Why and how 其实之前就想在博客园开创自己的博客了,但是自己之前已经利用自己的GitHub搭建了一个 博客,然后的话自己写的文章即水又不多,说到 ...
- Mybatis注解开发相关
一.项目构建 1.Java项目目录结构 2.在domain包下创建User实体类 package sun.domain; import java.io.Serializable; import jav ...