go 并发编程(3)
channel
go语言提供的消息通信机制被称为channel.
"不要通过共享内存来通信,而应该通过通信来共享内存".
channel是go语言在语言级别提供的goroutine之间的通信方式.是类型相关的,一个channel只能传递一种类型的值.这个类型需要在声明channel的时候指定.
在对应的channel被读取前,这个操作时阻塞的,在所有的goroutine启动完成后,我们通过<-ch语句从10个channel中依次读取数据,在对应的channel写入数据前,这个操作也是阻塞的.这样我们就用channel实现了类似锁的功能,进而保证了所有的goroutine完成后主函数才能返回.
go demo
package main
import (
"fmt"
"runtime"
)
func Count(ch chan int, i int) {
fmt.Println("counting", i)
ch <- i
fmt.Println("after chan", i)
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
chs := make([]chan int, 10)
for i := 0; i < 10; i++ {
chs[i] = make(chan int)
go Count(chs[i], i)
}
fmt.Println("start for")
for _, ch := range chs {
var ii int
ii = <-ch
fmt.Println("for ", ii)
}
}
select
go语言直接在语言级别支持select关键字,用于处理异步IO问题.
select 用法与switch类似,最大的一条限制是每个case语句必须是一个IO操作,case后都必须是chan操作
select{
case <-chan1:
// 如果成功从chan1成功数据
case chan2<-1:
// 如果成功向chan2写入数据
default:
//如果都没成功
}
// 随机写入 0,1
ch := make(chan int, 1)
for a := 0; a < 10; a++ {
select {
case ch <- 0:
case ch <- 1:
}
i := <-ch
fmt.Println(i)
}
缓冲机制
使用于需要持续传输大量数据的场景, c := make(chan int ,1024),即使没有读取方,写入方也可以一直往channel里写入,在缓冲区填完之前不会被阻塞.
从缓冲区读取数据与常规非缓冲channel完全一致,我们也可以使用range关键字来实现循环读取
超时机制
在往channel写入数据时发现已满,或读取数据时发现为空,如果不正确处理这些数据,很可能导致整个goroutine死锁.
可以结合select 进行超时处理.
channel 包括 双向channel,单项channel(只读channel,只写channel)
关闭channel
close(ch);判断关闭 x,ok := <-ch 只需要判断第二个bool返回值即可.false则表示关闭.
go 并发编程(3)的更多相关文章
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- 伪共享(false sharing),并发编程无声的性能杀手
在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 【Java并发编程实战】-----“J.U.C”:CLH队列锁
在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...
- 【Java并发编程实战】-----“J.U.C”:Exchanger
前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...
- 【Java并发编程实战】-----“J.U.C”:CountDownlatch
上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...
- 【Java并发编程实战】-----“J.U.C”:CyclicBarrier
在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...
- 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock
ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...
随机推荐
- BMP文件解析
目录 BMP文件简介 BMP文件格式 位图头 位图信息 调色板 位图数据 C语言代码 获取文件大小 获取文件尺寸 获取文件偏移量 读取文件数据示例 一个问题 完整程序 BMP文件简介 BMP(全称Bi ...
- github及git使用
一.github及git Github用于托管和协作项目的网站,git是通常与github一起使用的版本控制系统.Github上有上百万个开源项目,在使用git的时候每个开发人员都在他们的计算机上有一 ...
- (五)Java工程化--Jenkins
Jenkins简介 Jenkins 是一种用Java语言实现的持续集成工具,Jenkins是一个平台, 在此基础上实现下面两个目的. CI 持续集成(Continous Integration) CD ...
- Django之验证码
一.自己生成验证码 二.极验科技互动验证码 使用前步骤:下载官网文件——pip install geetest——引入其封装的js模块 代码分为三段:生成验证码——显示验证码——验证验证码. from ...
- [Linux容器]当我们谈容器的时候,我们在谈什么
Docker在当下很火,那么,当我们谈Docker,谈容器的时候,我们在谈什么? 或者说,你对Docker,对容器了解吗?容器,到底是怎么一回事儿? 这篇文章着重来讲一下Linux容器,为什么强调Li ...
- C++设计模式——中介者模式
前言 我们都知道,这个国际政治是一门很深的学问,不玩政治的人是搞不懂的.那么多的国家,国家之间的关系又及其复杂:就好比现在,美国和中国有经济利益关系,美国又和日本有盟友关系,朝鲜又和中国有说不清道不明 ...
- Lua中的一些库(1)
[数学库] 数学库(math)由一组标准的数学函数构成.这里主要介绍几个常用的函数,其它的大家可以自行百度解决. 三角函数(sin,cos,tan……)所有的三角函数都使用弧度单位,可以用函数deg( ...
- 【原创】大数据基础之Hadoop(1)HA实现原理
有些工作只能在一台server上进行,比如master,这时HA(High Availability)首先要求部署多个server,其次要求多个server自动选举出一个active状态server, ...
- Java 模拟http请求
package ln; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRea ...
- 金蝶K3 WISE BOM多级展开_BOM成本表
/****** Object: StoredProcedure [dbo].[pro_bobang_BOMCost] Script Date: 07/29/2015 16:09:11 ******/ ...