gpt4 book ai didi

concurrency - 为什么我的 go channel 被屏蔽了? (僵局)

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:16 26 4
gpt4 key购买 nike

似乎“复杂”(getC)功能被阻止了。我假设 channel 一旦被读取就会被销毁,因此我想知道如何与 getC 函数和 main 共享 sC channel 函数不会陷入死锁(current snippet)

package main

func main() {

//simple function and complex function/channel

sC := make(chan string)
go getS(sC)

cC := make(chan string)
go getC(sC, cC)

//collect the functions result

s := <-sC
//do something with `s`. We print but we may want to use it in a `func(s)`
print(s)
//after a while we do soemthing with `c`
c := <-cC


print(c)
}

func getS(sC chan string) {
s := " simple completed "
sC <- s
}

func getC(sC chan string, cC chan string) {
//we do some complex stuff
print("complex is not complicated\n")
//Now we need the simple value so we try wait for the s channel.
s := <-sC

c := s + " more "
cC <- c //send complex value
}

最佳答案

您不应该尝试从 main 函数中的 sC channel 获取值,因为您发送给它的唯一值被单独的 go 例程中的 getC 函数消耗。在尝试读取 sC channel 时,主要功能 block 等待某些东西并且它永远不会结束。 Go routine getS 完成,go routine getC 已经从 channel sC 消费了值,也完成了。 channel sC 中没有任何内容了。

可能的解决方案是创建另一个 channel s2C 并将从 sC channel 接收的值发送给它。

完整的正确代码如下所示:

package main

func main() {
sC := make(chan string)
go getS(sC)

s2C := make(chan string)
cC := make(chan string)
go getC(s2C, cC)

s := <-sC
println(s)
s2C <- s

c := <-cC
println(c)
}

func getS(sC chan string) {
s := " simple completed "
sC <- s
}

func getC(sC chan string, cC chan string) {
s := <-sC
c := s + " more "
cC <- c
}

关于concurrency - 为什么我的 go channel 被屏蔽了? (僵局),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22882934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com