gpt4 book ai didi

go - 当匿名函数在 golang 中永远等待 channel 时会发生什么?

转载 作者:IT王子 更新时间:2023-10-29 01:41:34 24 4
gpt4 key购买 nike

我有一个函数可以创建一个没有缓冲区的 channel 。此函数继续创建其他几个写入所述 channel 的并发匿名函数。然后该函数继续等待 channel 上的输入,然后返回值。

见下面的例子

package main

import (
"time"
"fmt"
"strconv"
"math/rand"
)

func main() {
for{
text := foo()
fmt.Println(text)
time.Sleep(time.Second)
}

}

func foo() string {
ch := make(chan string)
for i := 0; i < 10; i++ {
// Create some threads
go func(i int) {
time.Sleep(time.Duration(rand.Intn(1000))*time.Millisecond)
ch <- strconv.Itoa(i)
}(i)
}
return <- ch
}

即使整个函数(例如 foo)“已死”,仍在 channel 上等待的匿名函数会发生什么情况?

它们会作为垃圾被收集起来,还是会永远徘徊在我的计算机内存的中间地带(或者直到我杀死主线程)并在继续之前绝望地尝试发送它们的最后一条消息并吞噬它?

最佳答案

你有一个 goroutine 泄漏。

package main

import (
"fmt"
"math/rand"
"runtime"
"strconv"
"time"
)

func main() {
for {
text := foo()
fmt.Println(text, "NumGoroutine", runtime.NumGoroutine())
time.Sleep(time.Second)
}
}

func foo() string {
ch := make(chan string)
for i := 0; i < 10; i++ {
// Create some threads
go func(i int) {
time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
ch <- strconv.Itoa(i)
}(i)
}
return <-ch
}

输出:

$ go run leak.go
4 NumGoroutine 10
4 NumGoroutine 20
0 NumGoroutine 28
8 NumGoroutine 37
2 NumGoroutine 46
8 NumGoroutine 55
2 NumGoroutine 64
3 NumGoroutine 73
8 NumGoroutine 82
1 NumGoroutine 91
4 NumGoroutine 100
<<--SNIP-->>
4 NumGoroutine 4006
7 NumGoroutine 4015
6 NumGoroutine 4024
9 NumGoroutine 4033
9 NumGoroutine 4042
9 NumGoroutine 4051
1 NumGoroutine 4060
0 NumGoroutine 4069
4 NumGoroutine 4078
0 NumGoroutine 4087
6 NumGoroutine 4096
^Csignal: interrupt
$

像内存泄漏一样,goroutine 泄漏也很糟糕。

有关一些背景,请参阅 Go: proposal: runtime: garbage collect goroutines blocked forever #19702: Closed.

关于go - 当匿名函数在 golang 中永远等待 channel 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43493918/

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