Concurrency 102
12.11.2013
condition-variable или monitorsync, ако не можем да ползваме каналиmake
Операциите по изпращане и получаване се изпълняват с оператора <-
chan <- стойност изпраща по канала[променлива] <- chan получава от каналаКанал може да бъде затворен
c := make(chan int)
go func() {
list.Sort()
c <- 1
}()
doSomethingForAWhile()
<-cvar sem = make(chan int, MaxOutstanding)
func handle(r *Request) {
<-sem
process(r)
sem <- 1
}
func init() {
for i := 0; i < MaxOutstanding; i++ {
sem <- 1
}
}
func Serve(queue chan *Request) {
for {
req := <-queue
go handle(req)
}
}select {
case v1 := <-c1:
fmt.Printf("received %v from c1\n", v1)
case v2 := <-c2:
fmt.Printf("received %v from c2\n", v1)
case c3 <- c3:
fmt.Printf("sent %v to c3\n", 23)
default:
fmt.Printf("no one was ready to communicate\n")
}
Накратко: switch за канали.
Надълго: Изчаква първия канал, по който е изпратена стойност
defaultdefault блокира и изчакваselect {
case v1 := <-c1:
fmt.Printf("received %v from c1\n", v1)
case <- time.After(5 * time.Second):
fmt.Printf("timed out\n")
}