2016-04-09 6 views
-2

Golang fish, Искомое объяснение.gooroutine имеет приоритет или нет?

Goroutine это имеют приоритет или нет?

package main 

import (
    "fmt" 
) 

func sum(a []int, c chan int) { 
    var total int 
    for _, v := range a { 
    total += v 
    } 
    c <- total 
} 

func main() { 
    a := []int{7, 2, 8, -9, 4, 0} 
    c := make(chan int) 
    go sum(a[:len(a)/2], c) 
    go sum(a[len(a)/2:], c) 

    // x, y := <-c, <-c 
    x := <-c 
    y := <-c 
    fmt.Println(x, y, x+y) 
} 

, почему х -5 лет 17, это не первый goroutine заблокирован? если

go sum(a[:len(a)/2], c) 
x := <-c 
go sum(a[len(a)/2:], c) 
y := <-c 

этот порядок является правильным. почему ...

ответ

0

В вашем первом примере выход должен быть либо -5 17 12, либо 17 -5 12. Оба goroutines работают одновременно (в то же время). Результат того, что первый горутин заканчивается первым, будет сохранен в переменной x. Результат другого горутина хранится в y. Чтобы лучше видеть, что горуты работают одновременно, вы можете установить случайный таймер внутри функции sum(). Таким образом, вы должны увидеть изменение выходного сигнала между различными запусками, потому что один goroutine случайно занимает больше времени, чем другие:

package main 

import (
    "fmt" 
    "time" 
    "math/rand" 
) 

func sum(a []int, c chan int) { 
    time.Sleep(time.Duration(rand.Intn(1000000))) // wait for up to 1ms 
    total := 0 
    for _, v := range a { 
     total += v 
    } 
    c <- total 
} 

func main() { 
    rand.Seed(time.Now().Unix()) 
    a := []int{7, 2, 8, -9, 4, 0} 
    c := make(chan int) 
    go sum(a[:len(a)/2], c) 
    go sum(a[len(a)/2:], c) 

    x := <-c 
    y := <-c 
    fmt.Println(x, y, x+y) 
} 

В вашем втором примере, вы начинаете первый goroutine. Затем вы читаете с канала c, который является блокировкой (это означает, что он будет ждать, пока не будет результат => первый goroutine). Выход здесь детерминирован и всегда будет 17 -5 12.

+0

спасибо, я хочу знать, что goroutine является параллельным или параллельным? – rancongjie

+1

Это зависит от того, как установлен режим runtime.GOMAXPROCS. Вот хорошее объяснение: https://www.goinggo.net/2014/01/concurrency-goroutines-and-gomaxprocs.html – tonisuter