Concurrency 102
12.11.2013
condition-variable
или monitor
sync
, ако не можем да ползваме каналиmake
Операциите по изпращане и получаване се изпълняват с оператора <-
chan <- стойност
изпраща по канала[променлива] <- chan
получава от каналаКанал може да бъде затворен
c := make(chan int) go func() { list.Sort() c <- 1 }() doSomethingForAWhile() <-c
var 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
за канали.
Надълго: Изчаква първия канал, по който е изпратена стойност
default
default
блокира и изчакваselect { case v1 := <-c1: fmt.Printf("received %v from c1\n", v1) case <- time.After(5 * time.Second): fmt.Printf("timed out\n") }