Go非阻塞channel的常见写法
2019独角兽企业重金招聘Python工程师标准>>>
go作为一种天然支持并发的语言,它的并发操作特别简单,如下:
package mainfunc hello(word string) {fmt.Println("hello, ", word)
}func main() {word := "world"go hello(word)fmt.Println(word)
}
直接在需要并发的语句前加上关键字go即可,深入了解一下go关键字背后其实是执行了一个runtime.newproc()方法新生成一个goroutine来执行接下来的语句。那既然是生成了一个子协程,在日常编码的过程中,就肯定会涉及到如何在主协程和子协程之间进行通信的问题。一般地,在go的多线程环境中,我们通常使用go的管道类型channel来实现通信,当数据在channel中时,同一时刻只有一个协程能够访问数据,避免了出现竞争的可能,从而保证了并发安全。
但是channel默认是一种阻塞类型,如果编码的时候不注意代码的顺序,经常会导致程序出现死锁的情况。如下代码就华丽丽的遇到了死锁:
func say(ch chan int) {ch <- 2
}func main() {ch := make(chan int)say(ch) print(<-ch)
}
那应该如何实现非阻塞的channel使用:
1. 使用go关键字,创建一个新的协程,让管道的push和pop不在同一个协程中执行就可以避免死锁。
func main() {ch := make(chan int)go say(ch) print(<-ch)
}
2. 使用有缓存的管道channel,初始化时给channel指定buffer大小,在管道内的数据小于等于buffer值时,不会阻塞;超过则阻塞;
func main() {ch := make(chan int, 1)say(ch) print(<-ch)
}
3. 使用select关键字,该关键字可以监控channel管道中的数据流动,有流动就会触发相应的case,没有流动select会一直阻塞,类似于switch.
func main() {ch := make(chan int)ch1 := make(chan int) go say(ch)select {case c := <-ch1:print(c)default:print("no answer")}
}
转载于:https://my.oschina.net/u/3470972/blog/1581810
Go非阻塞channel的常见写法相关推荐
- 你应该使用Java8 非阻塞异步API来优化你的系统了
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 非同步和非阻塞 什么是非同步? 异步执行 不是同步的方式 ...
- 确定不来了解一下什么是 BIO NIO AIO 阻塞 非阻塞 同步 异步?
本文内容涉及同步与异步, 阻塞与非阻塞, BIO.NIO.AIO等概念, 这块内容本身比较复杂, 很难用三言两语说明白. 而书上的定义更不容易理解是什么意思. 下面跟着我一起解开它们神秘的面纱. BI ...
- mysql异步查询 java_基于 mysql 异步驱动的非阻塞 Mybatis
虽然 spring5 也推出了 WebFlux 这一套异步技术栈,这种极大提升吞吐的玩法在 node 里玩的风生水起,但 java 世界里异步依旧不是主流,Vertx 倒是做了不少对异步的支持,但是其 ...
- 阻塞式和非阻塞式udp传输_NIO非阻塞网络编程三大核心理念
本次开始NIO网络编程,之前已经说过BIO,对于阻塞IO里面的问题一定有了清晰的认识,在JDK1.4版本后,提供了新的JAVA IO操作非阻塞API,用意替换JAVA IO 和JAVA NetWork ...
- linux下网络编程设置非阻塞,UNIX网络编程 非阻塞connect的实现
一.<UNIX网络编程>-非阻塞connect 在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未 ...
- 用Java实现非阻塞通信
用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式.这些服务器程序或客户程序在运行过程中常常会阻塞.例如当一个线程执行ServerSocket的acc ...
- 深入学习java非阻塞IO
深入学习java非阻塞IO 三大组件: 1. Channel:数据通道双向通道 (1)常见的channel: FileChannel:文件传输通道 DatagramChannel:UDP传输通道 So ...
- EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接
EAGAIN.EWOULDBLOCK.EINTR与非阻塞 长连接 EWOULDBLOCK用于非阻塞模式,不需要重新读或者写 EINTR指操作被中断唤醒,需要重新读/写在Linux环境下开发经常会碰到很 ...
- ffmpeg中关于EAGAIN的理解及非阻塞IO
ffmpeg为在linux下开发的开源音视频框架,所以经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中). try again,从字面上来看,是提示 ...
最新文章
- redistemplate 设置失效时间_袋式除尘器滤袋失效分析
- ECSHOP二次开发文档【文件结构和数据库表分析】
- 59. 螺旋矩阵 II(模拟)
- 伪代码的简单例子_使用策略+工厂模式彻底干掉代码中的if else!
- adaboost算法java_Adaboost 算法实例解析
- 芯片,开源,数学,计算机
- 优雅 | koa处理异常
- java单例模式代码vol_单例模式--java代码实现
- 基于openstack的自动化测试平台设计头脑风暴
- android 安全加固总结报告,[原创]某加固详细分析总结,另附该加固脱壳机
- 解决WIN10下QTTabBar无法置于顶部
- 80286计算机配置,电脑的各种配置给详的细解释.doc
- html5的指南针app,HTML5 App实战(五):指南针
- [PDDL人工智能] 01.PDDL规划器安装及入门详解(规划领域定义语言)
- Available-Python-Tuf
- C# 图形处理-缩略图,图片合并,图片写文字,图片调整
- PLA:从线性可分到线性不可分的演化过程
- springboot整合dubbo设置全局唯一ID进行日志追踪
- 2017年12月英语六级翻译洞庭湖
- PMP备考之路 - 敏捷实践第五讲(实施敏捷:在敏捷环境中交付)
热门文章
- 多维列表索引_10分钟带你学会Pandas多层级索引
- win98 老电脑 文件导出_首次装电脑之前何不先模拟一番,这款练手神器可以帮你...
- linux 统计_聊聊 Linux 的内存统计
- python整人程序_python—做一个恶搞程序
- java 类方法应用题,java方法使用
- rust为什么显示不了国服_AWS偏爱Rust,已将Rust编译器团队负责人收入囊中
- hp代码改成linux代码,HP Database Archiving Software远程任意代码执行漏洞
- python字符串转日期_Python:将字符串时间字典转换为日期时间
- c++读取json文件_[SpringMVC]-SpringMVC架构-07-SpringMVC文件上传
- 计算机网络是互相连接的自治系统,自治系统内ip子网和sdn子网的互联机制imisa-江苏计算机网络.pdf...