首页 > 其他分享 >golang 死锁 all goroutines are asleep - deadlock!

golang 死锁 all goroutines are asleep - deadlock!

时间:2024-02-15 23:44:07浏览次数:29  
标签:deadlock 接收端 chan golang 死锁 ch asleep main

channel死锁

package main

import "fmt"

func main() {

    ch := make(chan string)

    for i := 0; i < 10; i++ {
        s := <- ch
        fmt.Println(s)
    }

    go func(ch chan string) {
        for i := 0; i < 10; i++ {
            ch <- fmt.Sprintf("%d", i)
        }

    }(ch)


}

 

报错

all goroutines are asleep - deadlock!

分析:无缓冲通道,只有接收端和发送端都准备好才会通过channel传输数据,所以main方法执行到s := <- ch这行代码会一直阻塞等待接收端准备好才能往下运行,而阻塞后接受端的代码就会一直运行不到,就会产生死锁。

解决

思路:先开启一个协程让运行接收端/发送端,main主协程继续往下执行。两个协程(接收断/发送端)都准备好后,就开始传输数据。

package main

import "fmt"

func main() {

    ch := make(chan string)

    go func(ch chan string) {
        for i := 0; i < 10; i++ {
            ch <- fmt.Sprintf("%d", i)
        }

    }(ch)

    for i := 0; i < 10; i++ {
        s := <- ch
        fmt.Println(s)
    }
 

标签:deadlock,接收端,chan,golang,死锁,ch,asleep,main
From: https://www.cnblogs.com/chenxiaomeng/p/18016763

相关文章

  • 8小时速成golang(五)golang高阶 channel基本定义和使用
     1、定义channel变量channel是Go语言中的一个核心类型,可以把它看成管道。并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度。 channel是一个数据类型,主要用来解决go程的同步问题以及go程之间数据共享(数据传递)的问题。goroutin......
  • 8小时golang速成(五)Golang高阶 1、goroutine
    1、goroutine 协程并发协程:coroutine。也叫轻量级线程。与传统的系统级线程和进程相比,协程最大的优势在于“轻量级”。可以轻松创建上万个而不会导致系统资源衰竭。而线程和进程通常很难超过1万个。这也是协程别称“轻量级线程”的原因。一个线程中可以有任意多个......
  • 8小时速成golang(四)反射reflect 和 结构体标签
    编程语言中反射的概念在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。每种语言的反射模......
  • 8小时速成golang(四)语法新奇
      1、从一个main函数初见golang语法packagemainimport"fmt"funcmain(){/*简单的程序万能的helloworld*/fmt.Println("HelloGo")}终端运行$goruntest1_hello.goHelloGo$gorun表示直接编译go语言并执行应用......
  • 8小时速成golang(三)Golang语言特性
    golang的优势一、极其简单的部署方式1、可直接编译成机器码2、不需要依赖其他库3、直接运行即可部署 二、静态语言类型可在编译的时候检查出大多隐藏问题 三、语言层面的并发1、天生的基因支持2、充分利用多核packagemainimport("fmt""time")fu......
  • 8小时速成Golang(二)Golang开发环境 环境配置
     Go官网下载地址:https://golang.org/dl/Go官方镜像站(推荐):https://golang.google.cn/dl/Go官网:https://golang.org/ golang在Windows安装和配置可看链接:https://blog.csdn.net/weixin_54626591/article/details/134485077按照步骤一步一步next再配置环境变量即可 golan......
  • golang基础知识
    init函数是什么时候执行的init函数的作用是程序执行前包的初始化init函数执行顺序同一go文件中可以写多个init函数,按照代码顺序依次执行同一个package中,按照文件名(ASCII码顺序)顺序执行不同包且不互相依赖,按照import的顺序执行不同package中且互相依赖的,最后被依赖的最......
  • Golang包管理
    go包管理历史gopathgo1.5版本之前GOPATHsrc存放源代码pkg存放编译后的文件bin存放编译后的可执行文件通过统一包存放的路径来进行管理不支持依赖包的版本控制gopath模式下工程代码必须放在GOPATH/src下goget将远程代码克隆到GOPATH/src目录下goi......
  • Golang内部包的使用
    函数和变量的可见性小写字母开头只能在内部访问internal文件夹internal父级,同级目录下的包可以访问internal目录内部的包作用例子将管理后台的包和用户的包分开,将工程放在internal里面,公用包放在外面私有包的导入本地包导入使用replace进行替换原来包的地址=>替换后的......
  • 8小时速成golang--Golang环境安装
    安装Golang的步骤如下:下载Golang安装包。访问Golang官方网站[golang.org](https://golang.org/),根据您的操作系统类型和位数选择合适的安装包。Windows系统通常下载.msi格式的安装包,而Linux系统则下载.tar.gz或.zip格式的安装包。安装Golang。对于Windows系统,双击......