2017-04-19 10 views
2

버퍼가없는 채널을 만드는 기능이 있습니다. 이 함수는 계속해서 해당 채널에 쓰는 몇 가지 다른 동시 익명 함수를 작성합니다. 그런 다음 함수는 채널에서 입력을 기다린 다음 값을 반환합니다.익명의 기능이 골란에서 영원히 채널에서 대기하면 어떻게됩니까?

전체 기능 (예 푸) "죽은"임에도 불구하고,

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 
} 

무엇 여전히 채널에 대기중인 익명 함수로 발생하는 아래의 예를 참조하십시오?

그들은 쓰레기로 수집 될 것인가, 아니면 지나가기 전에 필자의 마지막 메시지를 보내려는 필사적 인 시도로 내 컴퓨터 메모리의 림보를 영원히 방황 할 것인가?

+0

채널을 닫을 필요가 없습니다. 쓰기에서 채널을 사용하는 많은 기능으로 인해 할 수 없다면 제어 채널을 설정해야합니다. –

+0

나는 이것이 피할 수 있음을 안다. 그러나 나는 그렇게하지 않을 것이지만, 어떤 일이 일어나는지 알기 위해서다. 또 하나의 측면은 이것이 나쁜지 아닌지에 관한 것이며, 나는 정직하게도 그에 대한 대답이 없습니다. – Eric

+0

채널에 10 개의 값을 쓸 때 코드가 깨지지 만 처음에는 값을 읽었을뿐입니다. 적절한 테스트를 받으려면 모든 값을 읽어야합니다. –

답변

2

당신은 골 루틴 누출이 있습니다.

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.

+0

문제가 무엇인지 분명하게 알려 주셔서 감사합니다. 올바른 답변을 표시하십시오! – Eric