go channel
channel 是go语言中不同goroutine之间通信一种方法
//定义一个channel
c := make(chan bool)
//向channel中写入
c <- true
//读取channel
<-c
有缓存,写入或者读出后继续往下执行;
在读的地方,如果别的地方没有写入,则阻塞在那,等有写入时才,读出,继续执行下去;
在写的地方,如果别的地方没有读就会阻塞在写的这个地方,等带别的地方读出来;不被读掉就会阻塞;
无缓存通道只有读写同时发生是才不阻塞;
向一个通道中读或者写时,必须要有别的携程接受了这个参数;
取在读前面.有缓存是异步,无缓存是同步阻塞;
package main import (
"log"
"sync"
//"time" //延迟用
)
//channel 是一个引用类型 func main() {
//demo1()
//demo3()
//demo4()
//demo5()
demo6()
} //简单的迭代操作
func demo1(){
c := make(chan bool) //双向通道
go func(){
log.Println("gogogo!")
c <- true //向channel c中输入
close(c) //当channel在迭代操作是,必须在某个地方关闭它,不然程序将会进入死锁
}()
//go Go() //并发执行
//time.Sleep(2 *time.Second) // 延迟两秒中
//<-c //阻塞中只有当并发执行的方法中向c中输入是这边才继续往下执行
for v := range c{ //迭代操作c
log.Println(v)
}
}
func Go() {
log.Println("gogogo!")
} //单向通道
func demo2() { } //缓存:取在读前面.有缓存是异步,无缓存是同步阻塞;
//有缓存:有缓存,就会写入或者读出后继续往下执行;无缓存通道只有读写同时发生是才不阻塞;向一个通道中读或者写时,必须要有别的携程接受了这个参数;
//无缓存:在读的地方,如果别的地方没有写入,则阻塞在那,等有写入时才,读出,继续执行下去;在写的地方,如果别的地方没有读就会阻塞在写的这个地方,等带别的地方读出来;不被读掉就会阻塞;
func demo3(){
//c := make(chan bool,1) //有缓存
c := make(chan bool) //无缓存
go func(){
log.Println("")
c <- true //写入
}()
<- c //读出
} func demo4() {
c := make(chan bool,) //定义缓存为10
for i:=;i< ;i++ {
go demo4Go(c,i)
}
for i:=;i<;i++ { //循环读出10次后结束
<-c
}
} func demo4Go(c chan bool,index int){
a :=
for i := ; i<; i++ {
a += i
}
log.Println(index,a)
c <- true //循环一次向channel中写一次
} //创建任务组。WaitGrpup,并发执行,使用WaitGroup实现所有进程都完成
func demo5() {
wg := sync.WaitGroup{}
wg.Add() //添加十个任务
for i:=;i< ;i++ {
go demo5Go(&wg,i) //wg传递为地址传递
}
wg.Wait() //当全部任务完成后 继续执行
}
func demo5Go(wg *sync.WaitGroup,index int){
a :=
for i := ; i<; i++ {
a += i
}
log.Println(index,a)
wg.Done() //干掉一个任务
} func demo6(){
c1,c2 := make(chan int),make(chan string) //定义两个channel
o := make(chan bool) //总channel
go func(){
for {
select {
case v,ok := <- c1:
if !ok {
o<-true
break
}
log.Println("c1",v)
case v,ok := <-c2:
if !ok {
o<-true
break
}
log.Println("c2",v)
}
}
}()
c1 <-
c2 <- "hello"
c1 <-
c2 <- "world"
close(c1)
close(c2) <- o
}
go channel的更多相关文章
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- TODO:Go语言goroutine和channel使用
TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语言运行时(runtime)管理.使用的时候在函数前面加"go"这个 ...
- GO语言之channel
前言: 初识go语言不到半年,我是一次偶然的机会认识了golang这门语言,看到他简洁的语法风格和强大的语言特性,瞬间有了学习他的兴趣.我是很看好go这样的语言的,一方面因为他有谷歌主推,另一方面他确 ...
- Critical: Update Your Windows Secure Channel (cve-2014-6321,MS14-066)
前言:风雨欲来山满楼,下半年开始各种凶猛的漏洞层出不穷,天下已经不太平,互联网已经进入一个新的台阶 0x01 cve-2014-6321 11月的补丁月,微软请windows的用户吃了顿大餐,发布了1 ...
- JAVA NIO Channel
Basic: 多数通道都是链接到开发的文件描述符的.Channel类提供维持平台独立性的抽象过程. 通道是一种途径,访问和操作操作系统,缓冲区是数据操作点: Channel类继承结构图: 通过 ...
- channel Golang
Golang, 以17个简短代码片段,切底弄懂 channel 基础 (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的 ...
- [bigdata] flume file channel CPU消耗比 memory channel高的原因
https://www.quora.com/Why-does-flume-take-more-resource-CPU-when-file-channel-is-used-compared-to-wh ...
- 图解Netty之Pipeline、channel、Context之间的数据流向。
声明:本文为原创博文,禁止转载. 以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件) 当用户调用channel的connect时,会发起一个 ...
- go:channel(未完)
注:1)以下的所有讨论建立在包含整形元素的通道类型之上,即 chan int 2)对于“<-”我的理解是,它可能是一个操作符(接收操作符),也 可能是类型的一部分(如“chan<- in ...
随机推荐
- .Net语言 APP开发平台——Smobiler学习日志:快速实现应用中的图片、声音等文件上传功能
最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...
- 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持
在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...
- JavaScript触屏滑动API介绍
随着触屏手机.平板电脑的普及和占有更多用户和使用时间,触屏的触碰.滑动等事件也成为javaScript开发不可避免的知识,现在何问起就和大家一起学习js的触屏操作,js的触屏touchmove事件,为 ...
- 【微信开发】公众号后台设置错误导致的微信redirect_uri参数错误【图】
在微信开发中,如微信网页授权登录,分享到朋友圈自定义内容,微信h5支付时 可能会遇到微信redirect_uri参数错误的情况. 此时除了检查自己代码正确性外,还要检查一下是否正确地设置了公众号后台的 ...
- Python 基础之二用户交互input
Input是个内建函数: >>> input <built-in function input> >>> 具体用法:接收用户输入的内容,输入的字符串 ...
- 物联网框架SuperIO 2.2.9和ServerSuperIO 2.1同时更新,更适用于类似西门子s7-200发送多次数据,才能读取数据的情况
一.解决方案 二.更新内容 1.修改IRunDevice接口,把void Send(io,bytes)改成int Send(io,bytes).2.修改网络控制器,发送数据不直接使用IO实例,改为使用 ...
- entityframework学习笔记--006-表拆分与实体拆分
1.1 拆分实体到多张表 假设你有如下表,如图6-1.Product表用于存储商品的字符类信息,ProductWebInfo用于存储商品的图片,两张表通过SKU关联.现在你想把两张表的信息整合到一个实 ...
- 全球首个实战类微信小程序开发教程
小木学堂专注于企业实战开发和经验传授,所以微信小程序诞生这么大的事怎么能不带着大家一起学习学习呢,所以小木学堂讲师连夜赶工学习并实战开发了微信小应用的第一个程序,并录制了课程现免费分享给大家.这个速度 ...
- Autodesk View and Data API二次开发学习指南
什么是View and Data API? 使用View and Data API,你可以轻松的在网页上显示大型三维模型或者二维图纸而不需要安装任何插件.通过View and Data API,你可以 ...
- 慎用mutableCopy
因为逻辑需要,我在present到一个页面时,将一个存放uiimage的数组mutablecopy了过去(因为再返回的时候防止对数组做了改动),时间长了也忘了这事儿,后来发现添加多张图片上传时,app ...