说到channel,就一定要说一说线程了。任何实际项目,无论大小,并发是必然存在的。并发的存在,就涉及到线程通信。在当下的开发语言中,线程通讯主要有两种,共享内存与消息传递。共享内存一定都很熟悉,通过共同操作同一对象,实现线程间通讯。消息传递即通过类似聊天的方式。golang对并发的处理采用了协程的技术。golang的goroutine就是协程的实现。协程的概念很早就有,简单的理解为轻量级线程,goroutine就是为了解决并发任务间的通信而设计的。golang解决通信的理念是:不要通过共享内存来通信,而应该通过通信来共享内存。golang解决方案是消息传递机制,消息的传递就是通过channel来实现的。

  channel的使用很简单,这里就不在粘别人的东西了。现在谈一谈对channe阻塞l的理解。  

  发送者角度:对于同一个通道,发送操作(协程或者函数中的),在接收者准备好之前是阻塞的。如果chan中的数据无人接收,就无法再给通道传入其他数据。因为新的输入无法在通道非空的情况下传入。所以发送操作会等待 chan 再次变为可用状态:就是通道值被接收时(可以传入变量)。

  接收者角度:对于同一个通道,接收操作是阻塞的(协程或函数中的),直到发送者可用:如果通道中没有数据,接收者就阻塞了。

  通过一个简单的例子来说明:

package mainimport ("fmt"
)func f1(in chan int) {fmt.Println(<-in)
}func main() {out := make(chan int)out <- 2go f1(out)
}

运行结果:fatal error: all goroutines are asleep - deadlock!

  这是由于第13行之前不存在对out的接收,所以,对于out <- 2来说,永远是阻塞的,即一直会等下去。

  将13,14行互换

package mainimport ("fmt"
)func f1(in chan int) {fmt.Println(<-in)
}func main() {out := make(chan int)go f1(out)out <- 2
}

运行结果:2

  14行前存在对管道的读操作,所以out <- 2 是合法的。就像前文说的,发送操作在接收者准备好之前是阻塞的。

golang 协程 通道channel阻塞相关推荐

  1. golang协程——通道channel阻塞

    说到channel,就一定要说一说线程了.任何实际项目,无论大小,并发是必然存在的.并发的存在,就涉及到线程通信.在当下的开发语言中,线程通讯主要有两种,共享内存与消息传递.共享内存一定都很熟悉,通过 ...

  2. GoLang协程与通道---下

    GoLang协程与通道---下 新旧模型对比:任务和worker 惰性生成器的实现 实现 Futures 模式 复用 典型的客户端/服务器(C/S)模式 卸载(Teardown):通过信号通道关闭服务 ...

  3. Python与Golang协程异同

    背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...

  4. golang 协程同步 简介

    目录 协程概念简要理解 为什么要做同步 协程的几种同步方法 Mutex channel WaitGroup 协程概念简要理解 协程类似线程,是一种更为轻量级的调度单位,但协程还是不同于线程的,线程是系 ...

  5. golang 数组 最后一个_面试必问:Golang高阶Golang协程实现原理

    1 01 引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发). 1.1 进程和 ...

  6. go 怎么等待所有的协程完成_怎么关闭golang协程

    怎么关闭golang协程 发布时间:2020-06-10 10:43:33 来源:亿速云 阅读:284 作者:Leah 这篇文章给大家分享的是关闭golang协程的方法.小编觉得挺实用的,因此分享给大 ...

  7. Golang 协程的使用方法

    Golang 协程正确的使用方法 错误的使用方法 package main // 错误使用案例 import ("time""fmt" ) var c1 cha ...

  8. GO语言的进阶之路-协程和Channel

    GO语言的进阶之路-协程和Channel 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 看过我之前几篇博客小伙伴可能对Golang语言的语法上了解的差不多了,但是,如果想要你的代码 ...

  9. 关于C10K、异步回调、协程、同步阻塞

    2019独角兽企业重金招聘Python工程师标准>>> 最近到处在争论这些话题,发现很多人对一些基础的常识并不了解,在此发表一文做一下解释.此文未必能解答所有问题,各位能有一个大致的 ...

最新文章

  1. 全球著名音乐抓轨软件EAC 设置详解
  2. MySQL字符编码设置
  3. ARM的批量加载/存储指令
  4. 微服务架构下,解决数据一致性问题的实践 1
  5. Struts学习总结之配置文件
  6. 【转载记录】Accessing Device Drivers from C#
  7. 编写程序,使用一维数组,模拟栈数据结构。 要求: 1、这个栈可以存储java中的任何引用类型的数据。 2、在栈中提供push方法模拟压栈。(栈满了,要有
  8. 程序开源与不开源区别_如何在公司中启动开源程序
  9. 一个男生写的关于怎么追女生昨天没有说一个很关键的东西
  10. 常见的HTTP错误码
  11. 各种排序算法稳定性的探讨
  12. java实现10种排序算法
  13. cad插件_CAD插件自动标注安装教程
  14. 【scratch案例教学】scratch端午节划龙舟比赛 scratch创意编程 少儿编程 边玩边学过个快乐端午节
  15. Android可达性分析,基于时间距离的机会网络可达性分析及应用
  16. MacBook苹果电脑翻盖自动开机及音效设置
  17. 越南语关于时间的词汇描述
  18. 如何测试微信的点赞功能
  19. 最简单的视频编码器(一)---libx264
  20. 根据年份和月份来计算天数

热门文章

  1. springcloud使用pagehelper 实现分页,及total 数据问题
  2. 文字如何实现完美UI?文本排版设计告诉你
  3. Android 更新项目名称
  4. 给定一个字典,通过查找这个字典,替换给定的字符串中的中文为英文
  5. javascript如何判断变量的数据类型
  6. Kobject结构体分析
  7. MOSS 权限管理总结
  8. SUN PORTAL 7.2安装在windows 的问题解决办法!
  9. 2018年台湾为陕西最大贸易伙伴
  10. PHP回调函数的几种用法