登录
首页 >  Golang >  Go问答

为什么我会遇到死锁,即使它包含无限循环?

来源:stackoverflow

时间:2024-04-23 15:33:31 363浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《为什么我会遇到死锁,即使它包含无限循环?》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我开始摆弄 go,并且对 go 例程着迷。我现在编写了一个简单的测试,看看我是否可以在连续打印变量的同时更改它的值。

我现在有以下代码:

package main

import (
    "fmt"
    "time"
)

func change(c chan float64) float64 {
    time.sleep(2 * time.second)
    return 2.5
}

func main() {

    s := 1.1

    c := make(chan float64)
    go change(c)
    s = <-c

    for {
        fmt.println(s)
        time.sleep(100 * time.millisecond)
    }    
}

不幸的是,它以错误结束:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
        /home/kramer65/repos/go/src/messing_around/main.go:19 +0x7d
exit status 2

我搜索了一下,发现当 main 函数结束而 goroutine 尚未结束时,就会发生这种死锁。但由于我有一个无限循环,我不知道我的代码还有什么问题。

这段代码有什么问题,以及如何在连续打印变量的同时更改它的值?


解决方案


看来您可能对通道和 go 例程有误解。

行:

go change(c)

似乎表明函数 change 将写入 c。然而,它最终只是在一段时间后返回一个值。

此值 (2.5) 不会在任何地方收到。此外,c 不会被写入任何地方。我怀疑您打算将 2.5 写入通道 c。其语法如下:

c<-2.5

因此,如果您将 change 函数更改为:

func change(c chan float64) {
    time.sleep(2 * time.second)
    c <- 2.5
}

您不应该再看到僵局。请注意,我不再返回 float64

我做了一个演示来确保这一点:https://play.golang.org/p/SgLiUmPpcAZ

评论更新

1.1 将始终被通道的值覆盖。但是,如果您想打印 s 的初始值(如评论中所述),则必须稍微更改流程并使用 select 语句:

package main

import (
    "fmt"
    "time"
)

func change(c chan float64) {
    time.sleep(2 * time.second)
    c <- 2.5
}

func main() {

    s := 1.1

    c := make(chan float64)
    go change(c)

    for {
        select {
        case s = <-c:
        default:
            // c isn't ready yet
        }
        fmt.println(s)
        time.sleep(100 * time.millisecond)
    }
}

现在您有了 select 语句,您也可以将它与 time.ticker 一起使用:

ticker := time.NewTicker(100 * time.Millisecond)
for {
    select {
    case s = <-c:
    case <-ticker.C:
        fmt.Println(s)
    default:
        // c isn't ready yet
    }
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>