fatal error: all goroutines are asleep - deadlock!

代码如下

package mainimport ("fmt""time"
)func deadLock(c chan string) {timeout := time.Millisecond * time.Duration(10)tk := time.NewTicker(timeout)defer tk.Stop()for {select {case txt := <-c:fmt.Println("chan value ",txt)returncase <-tk.C:fmt.Println("time out")return}}
}func main() {c :=make(chan string)c<-"Hello World"go deadLock(c)time.Sleep(time.Millisecond)
}

上面代码运行时报错:fatal error: all goroutines are asleep - deadlock!

why ?

我们通过make(chan int)创建了一个信道,由于没有指定chan的大小,这是一个无缓冲区的信道,所以当对这个信道写的时候,会一直阻塞等到某个协程对这个信道读。main函数的执行在go语言中本身就是一个协程的执行,所以在执行到c<-"Hello World"的时候,执行main函数的协程将被阻塞,此时不能再继续往下执行了,所以go deadLock(c)这个函数同样也无法执行到了,就无法读到c中的内容了,所以整个程序阻塞,发生了死锁。

How to solve it ?

程序阻塞的原因是main函数不能继续向下执行了,所以go deadLock(c) 执行不到,那我们在main函数中另开一个协程,让他对c进行写,这样main函数就能继续往下执行。

package mainimport ("fmt""time"
)func deadLock(c chan string) {timeout := time.Millisecond * time.Duration(10)tk := time.NewTicker(timeout)defer tk.Stop()for {select {case txt := <-c:fmt.Println("chan value",txt)returncase <-tk.C:fmt.Println("time out")return}}
}func writeChan(c chan string) {c<-"Hello World"
}func main() {c :=make(chan string)go writeChan(c)go deadLock(c)time.Sleep(time.Millisecond)
}

Go中chan引发的协程死锁相关推荐

  1. Python中多线程多进程与协程的区别

    进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大. 线程: 调度执行的最小单位,也叫执行路径,不能 ...

  2. 简要说明__python3中的进程/线程/协程

    多任务可以充分利用系统资源,极大提升程序运行效率,多任务的实现往往与 多线程,多进程,多协程有关 稳定性: 进程 > 线程 > 协程 系统资源占用量:进程 > 线程 > 协程 ...

  3. php curl header_PHP中的yield与协程(二十一节)

    大家好,我是老李. 顺风说骚话,逆风讲道理 最近在大家一起努力下,那个沙雕肺炎患病人数增长率下降了不少,总体来说还算顺,所以今天这篇注定又要骚话连篇了.听说最近不少玉米开始向大连.威海.烟台方向涌入, ...

  4. python中IO多路复用、协程

    一.IO多路复用 IO多路复用:检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据)(可读/可写) import socket def get_data(key):client ...

  5. Go语言中开启和退出协程

    一 协程的概念 协程(coroutine)是Go语言中的轻量级线程实现:与线程不同的是,协程不受操作系统调度,协程的调度由用户程序自行提供:Go语言中的协程调度器将协程调度到线程中运行 二 协程的开启 ...

  6. php defer,PHP 协程:Go + Chan + Defer

    Swoole4提供了强大的PHP CSP协程编程模式.底层提供了3个关键词,可以方便地实现各类功能. 关键词 go :创建一个协程 chan :创建一个通道 defer :延迟任务,在协程退出时执行, ...

  7. C++ 协程的近况、设计与实现中的细节和决策

    时至2018年的今天,C++ 在互联网服务端开发方向依然占据着相当大的份额:百度,腾讯,甚至以java为主流开发语言的阿里都在大规模使用C++做互联网服务端开发,而这恰恰是本文想要讨论的范畴. C++ ...

  8. tornado中的协程是如何工作的

    转自:http://blog.csdn.net/wyx819/article/details/45420017 本文将按以下结构进行组织,说明tornado中协程的执行原理 协程定义 生成器和yiel ...

  9. transactionscope 中的异步 处理 异常_协程中的取消和异常 | 异常处理详解

    开发者们通常会在打磨应用的正常功能上花费很多时间,但是当应用出现一些意外情况时,给用户提供合适的体验也同样重要.一方面来讲,对用户来说,目睹应用崩溃是个很糟糕的体验:而另一方面,在用户操作失败时,也必 ...

  10. python协程池操作mysql_在python中使用aiomysql异步操作mysql

    之前一直在使用mongo与redis,最近在项目中开始使用mysql数据库,由于现在的项目是全程异步的操作,所以在在网上查了下关于在python中异步的操作mysql,找来找去最后发现aiomysql ...

最新文章

  1. 天文学家发现首个“流浪黑洞”,60多个科研机构追踪10年,终因引力透镜露出马脚...
  2. 简单理解js闭包、类型引用....第一章
  3. 直播预告丨挖掘客户生命周期价值,寻迹券商业务增长
  4. POJ 3254 状态压缩DP
  5. 当你老了,一生最后悔什么?大数据告诉你!
  6. python消息订阅_python rabbitmq消息发布订阅
  7. ChineseSemanticKB,面向中文处理的12类、百万规模的语义常用词库存
  8. laravel商品图片怎么展示_如何使用Laravel图片处理包intervention-image
  9. vuejs粒子动画特效 npm安装插件vue-particles(particles.js) - 代码篇
  10. 第二代电子计算机逻辑部件主要由,计算机组成原理参考答案
  11. Excel 作复合饼图和双轴柱形图
  12. Ubuntu下安装nvidia显卡驱动
  13. 未认证小程序关联已认证公众号,复用公众号资质快速进行认证
  14. Kaldi中文语音识别:各种开源的已经训练好的语音识别模型
  15. 2022年兽药行业发展前景
  16. 什么是 Web 3.0:面向未来的去中心化互联网
  17. NVD软件漏洞数据处理及分类方法总结
  18. 你是如何进行群发邮件的呢 告诉你一些快速高效的群发邮件方法
  19. Web思维导图实现的技术点分析
  20. 电子商务作业3:开网店

热门文章

  1. 应用计算机最高奖,中国首次问鼎超算应用最高奖
  2. Projector学习笔记
  3. 山东省大学生软件设计大赛
  4. win7误删文件怎么恢复?
  5. 基于node连接广工大服务器获取信息
  6. WIN7中如何卸载IE8或IE9
  7. Wed Jul 22 00:00:00 CST 2020 java转成指定日期格式的字符串
  8. mysql workbench 安全模式_MySQL Workbench的安全模式解决
  9. 微信改微信号连接服务器,微信修改不了微信号怎么回事 微信号怎么修改
  10. 涉密计算机涉密存储设备或者改作其他用途的,将未经安全技术处理的退出使用的涉密计算机涉密存储设备或者改作其他用途的依法给予处分...