博客
关于我
fatal error all goroutines are asleep - deadlock!
阅读量:488 次
发布时间:2019-03-07

本文共 1074 字,大约阅读时间需要 3 分钟。

在运行Golang程序时,处理多个Goroutine的程序设计需要仔细规划,特别是在多个Goroutine之间进行通信时。通过分析上述代码,可以看出aciones in想法:


成功案例分析:

  • 代码结构
  • package mainimport ("fmt" "time")func main() {    ch1 := make(chan int)    go func() {        fmt.Println("-
    1. 原因分析
      • Goroutine启动go func() { fmt.Println("-<ch1") }() 在启动之后,主Goroutine可以立即发送ch1 <-1
      • 操作顺序:发送操作执行完后,程序进入睡眠,等待一秒。在这段时间内,Goroutine已经启动并等待接收ch1
      1. 结果:Goroutine在主Goroutine发送值后能够接收到值,程序顺利完成,没有死锁。

      2. 失败案例分析:

      3. 代码结构
      4. package mainimport ("fmt" "time")func main() {    ch1 := make(chan int)    ch1 <-1    go func() { fmt.Println("-
        1. 原因分析
          • 问题所在:主Goroutine首先发送数据ch1 <-1,然后立即启动Goroutine。
          • 结果:启动Goroutine后,主Goroutine立即进入睡眠状态。Goroutine没有接收到任何值,因此导致死锁。

          改进建议:

          为了避免死亡锁,应该确保在发送数据时,Goroutine已经启动,并且能及时接收到数据。

        2. Goroutine启动顺序

          • 将Goroutine的启动放在发送数据之后。
          ch1 := make(chan int)go func() { fmt.Println("-
        3. 保证接收机会

          • 确保Goroutine有机会运行,可以接受到数据。例如,在短时间内启动Goroutine。
        4. 避免过早发送数据

          • 发送数据后不要立即进入睡眠状态,否则其他Goroutine无法接收到数据。

        5. 总结:

          • 在Goroutine编程时,确保发送和接收的操作有正确的顺序。
          • 主Goroutine不应在发送数据后立即执行睡眠,否则导致其他Goroutine无法接收到数据。
          • 在设计多Goroutine程序时,需要合理安排Goroutine启动和数据传输的顺序,避免死锁和其他并发问题。

          通过不断的实践和分析,可以逐步掌握Golang中的Goroutine编程技巧,确保程序能够高效且稳定地运行。

    转载地址:http://xfkjz.baihongyu.com/

    你可能感兴趣的文章
    windows快捷键隐藏桌面所有窗口——“老板键”
    查看>>
    微信自定义分享ios无效
    查看>>
    this.$router.push不起作用(this指向错误)
    查看>>
    Sublime安装px转rem插件
    查看>>
    retrofit --post请求
    查看>>
    IDEA上传Jar
    查看>>
    SpringBoot工程临时加一个分页的yml文件没有生效
    查看>>
    搭建的SpringMVC项目,404错误,确保代码正确的前提,可能是jar包没导进去
    查看>>
    flume使用中的一些常见错误解决办法 (地址已经使用)
    查看>>
    基于递归的全排列
    查看>>
    前端笔试题总结(三) - CSS篇
    查看>>
    C语言字符型、整型和变量的长度
    查看>>
    OpenCV camshift目标追踪
    查看>>
    Redis缓存穿透和缓存雪崩
    查看>>
    AttributeError: module ‘torch‘ has no attribute ‘gesv‘
    查看>>
    spring 的@ComponentScan 理解
    查看>>
    C++ e 神秘数组——vector
    查看>>
    day04_CSS选择器
    查看>>
    js 获取时间戳的方法
    查看>>
    C++ 底层语言的信仰-指针分类
    查看>>