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 ...
随机推荐
- 今天我们来认识一下JSP的九大内置对象
虽然现在基本上我们都是使用SpringMVC+AJAX进行开发了Java Web了,但是还是很有必要了解一下JSP的九大内置对象的.像request.response.session这些对象,即便使用 ...
- [翻译+山寨]Hangfire Highlighter Tutorial
前言 Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows ...
- 怎么解决tomcat占用8080端口问题
怎么解决tomcat占用8080端口问题 相信很多朋友都遇到过这样的问题吧,tomcat死机了,重启eclipse之后,发现 Several ports (8080, 8009) requir ...
- Scrapy开发指南
一.Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. Scrapy基于事件驱动网络框架 Twis ...
- filter 过滤器(监听)
Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...
- linux添加启动器图标(Ubuntu为例)
添加启动器图标,以eclipse为例,%表示命令提示符,shell命令:%nano /usr/share/applications/eclipse.desktop-----------[Deskto ...
- jdk安装
x86 和 x64的安装判别 [root@CentOS ~]# uname -aLinux CentOS 2.6.32-358.el6.i686 #1 SMP Thu Feb 21 21:50:49 ...
- struts2杂记(一)——使用doubleSelect
一.前言 这段时间忙的要死,做项目,学框架,时间根本不够用,只能尽量抽出时间记录自己学过的东西. 1.1.doubleSelect 在之前学习中,我们使用过二级列表,相信很多人都理解其原理,在stru ...
- Angel工作室EasyUI通用权限管理框架正式发布
框架系统基本功能: 1.管理员管理 2.日志管理 3.菜单导航管理 4.角色管理 5.操作权限管理 6.系统设置管理 7.报表导出 8.系统参数管理 该框架应该说是码农们接单利器的首选解决方案,本框 ...
- table 鼠标移上去改变单元格边框颜色。
表格定义了border-collapse:collapse;边框会合并为一个单一的边框.会忽略 border-spacing 和 empty-cells 属性. 用td:hover,显示不全