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的常见写法相关推荐

  1. 你应该使用Java8 非阻塞异步API来优化你的系统了

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 非同步和非阻塞 什么是非同步? 异步执行 不是同步的方式 ...

  2. 确定不来了解一下什么是 BIO NIO AIO 阻塞 非阻塞 同步 异步?

    本文内容涉及同步与异步, 阻塞与非阻塞, BIO.NIO.AIO等概念, 这块内容本身比较复杂, 很难用三言两语说明白. 而书上的定义更不容易理解是什么意思. 下面跟着我一起解开它们神秘的面纱. BI ...

  3. mysql异步查询 java_基于 mysql 异步驱动的非阻塞 Mybatis

    虽然 spring5 也推出了 WebFlux 这一套异步技术栈,这种极大提升吞吐的玩法在 node 里玩的风生水起,但 java 世界里异步依旧不是主流,Vertx 倒是做了不少对异步的支持,但是其 ...

  4. 阻塞式和非阻塞式udp传输_NIO非阻塞网络编程三大核心理念

    本次开始NIO网络编程,之前已经说过BIO,对于阻塞IO里面的问题一定有了清晰的认识,在JDK1.4版本后,提供了新的JAVA IO操作非阻塞API,用意替换JAVA IO 和JAVA NetWork ...

  5. linux下网络编程设置非阻塞,UNIX网络编程 非阻塞connect的实现

    一.<UNIX网络编程>-非阻塞connect 在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未 ...

  6. 用Java实现非阻塞通信

    用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式.这些服务器程序或客户程序在运行过程中常常会阻塞.例如当一个线程执行ServerSocket的acc ...

  7. 深入学习java非阻塞IO

    深入学习java非阻塞IO 三大组件: 1. Channel:数据通道双向通道 (1)常见的channel: FileChannel:文件传输通道 DatagramChannel:UDP传输通道 So ...

  8. EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接

    EAGAIN.EWOULDBLOCK.EINTR与非阻塞 长连接 EWOULDBLOCK用于非阻塞模式,不需要重新读或者写 EINTR指操作被中断唤醒,需要重新读/写在Linux环境下开发经常会碰到很 ...

  9. ffmpeg中关于EAGAIN的理解及非阻塞IO

    ffmpeg为在linux下开发的开源音视频框架,所以经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中). try again,从字面上来看,是提示 ...

最新文章

  1. redistemplate 设置失效时间_袋式除尘器滤袋失效分析
  2. ECSHOP二次开发文档【文件结构和数据库表分析】
  3. 59. 螺旋矩阵 II(模拟)
  4. 伪代码的简单例子_使用策略+工厂模式彻底干掉代码中的if else!
  5. adaboost算法java_Adaboost 算法实例解析
  6. 芯片,开源,数学,计算机
  7. 优雅 | koa处理异常
  8. java单例模式代码vol_单例模式--java代码实现
  9. 基于openstack的自动化测试平台设计头脑风暴
  10. android 安全加固总结报告,[原创]某加固详细分析总结,另附该加固脱壳机
  11. 解决WIN10下QTTabBar无法置于顶部
  12. 80286计算机配置,电脑的各种配置给详的细解释.doc
  13. html5的指南针app,HTML5 App实战(五):指南针
  14. [PDDL人工智能] 01.PDDL规划器安装及入门详解(规划领域定义语言)
  15. Available-Python-Tuf
  16. C# 图形处理-缩略图,图片合并,图片写文字,图片调整
  17. PLA:从线性可分到线性不可分的演化过程
  18. springboot整合dubbo设置全局唯一ID进行日志追踪
  19. 2017年12月英语六级翻译洞庭湖
  20. PMP备考之路 - 敏捷实践第五讲(实施敏捷:在敏捷环境中交付)

热门文章

  1. 多维列表索引_10分钟带你学会Pandas多层级索引
  2. win98 老电脑 文件导出_首次装电脑之前何不先模拟一番,这款练手神器可以帮你...
  3. linux 统计_聊聊 Linux 的内存统计
  4. python整人程序_python—做一个恶搞程序
  5. java 类方法应用题,java方法使用
  6. rust为什么显示不了国服_AWS偏爱Rust,已将Rust编译器团队负责人收入囊中
  7. hp代码改成linux代码,HP Database Archiving Software远程任意代码执行漏洞
  8. python字符串转日期_Python:将字符串时间字典转换为日期时间
  9. c++读取json文件_[SpringMVC]-SpringMVC架构-07-SpringMVC文件上传
  10. 计算机网络是互相连接的自治系统,自治系统内ip子网和sdn子网的互联机制imisa-江苏计算机网络.pdf...