2016-04-09 23 views
-2

Golang balıkları , Bir açıklama istemek.gooroutinin bir önceliği olsun ya da olmasın?

Goroutine bir önceliğe sahip olup?

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

nedenle, x, y 17 -5 ilk goroutine bloke değildir?

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

eğer bu düzen haklı. Neden your

cevap

0

İlk örneğinizde, çıktı -5 17 12 veya 17 -5 12 olmalıdır. Her iki goroutinler de aynı anda çalışıyor. İlk önce hangisi olursa olsun, sonuç x değişkeninde saklanacaktır. Diğer goroutinin sonucu y'da saklanır. Goroutines'in aynı anda çalıştığını daha iyi görebilmek için, sum() işlevinin içine rastgele bir zamanlayıcı yerleştirebilirsiniz. tek goroutine rastgele diğerinden daha uzun sürer, çünkü bu şekilde, farklı koşular arasındaki çıkış değişimi görmek gerekir:

İkinci örnekte
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) 
} 

, ilk goroutine başlıyor. Sonra bir engelleme işlemi olan c kanalından okudunuz (yani bir sonuç olana kadar bekleyecektir => ilk goroutine yapılır). Buradaki çıktı belirleyici ve her zaman 17 -5 12 olacaktır.

+0

Teşekkürler, goroutine'nin paralel veya eşzamanlılık olduğunu bilmek istiyorum? – rancongjie

+1

Bu, runtime.GOMAXPROCS'nin nasıl ayarlandığına bağlıdır. İşte iyi bir açıklama: https://www.goinggo.net/2014/01/concurrency-goroutines-and-gomaxprocs.html – tonisuter

İlgili konular