2015-09-20 2 views
2
package main 

import "fmt" 

func sum(a []int, c chan int) { 
    sum := 0 
    for _, v := range a { 
     sum += v 
    } 
    c <- sum // send sum to c 
} 

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 // receive from c 

    fmt.Println(x, y, x+y) 
} 

x, y := <-c, <-c // receive from cgoroutine вне заказ на канал фиксированный?

Почему эта линия всегда печатать один и тот же результат?

Я думаю, что это должно быть 50/50 шанс распечатать 17 -5 12 или -5 17 12

Я думаю, что два идут процедуры должны быть параллельны

Заранее спасибо!

package main 

import "fmt" 
import "time" 
import "math/rand" 

func sum(a []int, c chan int) { 
    sum := 0 
    for _, v := range a { 
     sum += v 
    } 
    time.Sleep(time.Millisecond * time.Duration(rand.Intn(1000))) 
    c <- sum // send sum to c 

} 

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 // receive from c 

    fmt.Println(x, y, x+y) 
} 

Я делаю нить спать, но то же самое происходит. Я все еще запутался.

+0

Вы используете Go 1.5? Также, сколько ядер? – OneOfOne

+0

yes go1.5 one core – Shawn

+0

@Shawn Включение сна в конце функции вроде этого не будет иметь эффекта, который вы ищете. Кроме того, основная функция не дожидалась завершения сна до завершения, поэтому сон практически ничего не делает. –

ответ

2

Предпочитаете, что должно быть быть случайной ошибкой 50/50. Чтобы быть ясным, я не предполагаю, что он всегда должен быть тем или иным, а скорее не следует ожидать, что он будет меняться каждый раз, когда запускается программа. Поведение не обязательно является случайным (или даже псевдослучайным).

Гарантия goroutine заключается не в том, что он запланирован на случайное будущее, а скорее на то, что он будет работать в будущем. Если текущая реализация планировщика решила разместить goroutines в простой очереди, это автоматически не означает, что он сломан. Для случая вашего конкретного кода, если вы придерживаетесь нескольких time.Sleep s или fmt.Printf s в разных местах, вы, вероятно, иногда увидите изменение порядка.

Интересно, запутался ли вы планировщик Go в следующем горутине с документированным псевдослучайным поведением select при использовании с каналами. Поведение там определено как случайное, и правильно сказать, что поведение должно иметь шанс 50/50.

Насколько я знаю, выбор, который будет выбирать, будет случайным. Это не то же самое, что сказать, что это не может быть случайным, но более того, что это не предположительно быть случайным.

Важно то, что ваш код не должен заботиться о порядке, в котором планируются голосовые планы. Всегда ли это как очередь, или назад (стек), или случайный, или что-то еще (вероятно, реальность).

+0

Я делаю нить спать, но то же самое происходит. Я все еще запутался. – Shawn

+0

спасибо, кстати .. – Shawn

+0

@Shawn вы положили сон после того, как значение будет размещено на канале, это не будет иметь эффекта, который вы ищете. –

Смежные вопросы