Concurrency 102

12.11.2013

Cond

Communicate by sharing vs. Share by communicating

Channels

Употреба на канали

IO в канал

Операциите по изпращане и получаване се изпълняват с оператора <-

Канал може да бъде затворен

Пример

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)
    }
}

Channel within a channel within a channel... chancespion!

select

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 за канали.
Надълго: Изчаква първия канал, по който е изпратена стойност

Пример

select {
case v1 := <-c1:
    fmt.Printf("received %v from c1\n", v1)
case <- time.After(5 * time.Second):
    fmt.Printf("timed out\n")
}

Въпроси?