데이비드 그레이의 수정 작동하지만 9
항상 수신되지 않는 이유에 대한 설명은 주석에 맞지 않을 것이다 :
package main
func Commander(commands chan int, responses chan int) {
for i := 0; i < 10; i++ {
print(i, " command\n")
commands <- i
print(<-responses, " response\n");
}
close(commands)
}
func Responder(commands chan int, responses chan int) {
for {
x, open := <-commands
if !open {
return;
}
responses <- x + 2
}
}
func main() {
commands := make(chan int)
responses := make(chan int)
go Commander(commands, responses)
Responder(commands, responses)
}
내가 golang.org에서 실행 출력입니다!
송신 측의 goroutine이 채널의 값을 송신하면, 수신 측의 goroutine이 그 값을 수신 할 때까지 블록한다. 그 시점에서 차단 해제됩니다. 이동 스케줄러는 수신 goroutine에 아무 것도 인쇄 할 수 없도록하기 전에 거의 즉시 main에서 돌아올 수 있습니다. GOMAXPROCS를 1보다 큰 값으로 설정하면 주 goroutine이 활성화되어있는 동안 수신 goroutine이 차단되지 않으므로 발생 빈도가 줄어 듭니다.
모든 goroutines이 완료 될 때까지 반환에서 주요 중지 할 경우이 같은 Receive()
에서 채널을 반환 할 수 있습니다 당신의 출력이 원래의 예에서 비어있는 이유에 관해서는
package main
import "fmt"
func Send(ch chan<- int) {
for i := 0; i < 10; i++ {
fmt.Println(i, " sending")
ch <- i
}
close(ch)
}
func Receive(ch <-chan int) (<-chan bool) {
done := make(chan bool)
go func() {
for {
i, ok := <-ch
if !ok {
break
}
fmt.Println(i, " received")
}
done <- true
}()
return done
}
func main() {
ch := make(chan int)
d := Receive(ch)
Send(ch)
_ = <-d
}
: 당신이 만드는 두 개의 goroutines, 따라서 메인은 완전히 차단 해제되어서 그냥 돌아오고 프로그램이 종료됩니다! 나는 분명히이 실수를 범했습니다. 그러나 런타임은 여러분이 기대하는 것처럼 모든 goroutines가 아닌 주요 goroutine과 만 조인합니다.
출처
2011-11-22 16:35:44
mkb
게시하기 전에 들여 쓰기를 수정하십시오. –