Я пытаюсь понять, почему это дело всегда происходит - PullRequest
0 голосов
/ 31 января 2019

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

Я пыталсяпомещая строку <-res[i] в оператор case, но по какой-то причине этот случай всегда отключается независимо от того, есть ли у каналов значение.

package main

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

)

func numbers(sz int) (res chan float64) {
    res = make(chan float64)
    go func() {
        defer close(res) 
        num := 0.0
        time.Sleep(time.Duration(rand.Intn(1000)) *time.Microsecond)
        for i := 0; i < sz; i++ {
            num += math.Sqrt(math.Abs(rand.Float64()))
        }
        num /= float64(sz)
        res <- num
        return
    }()
    return
}

func main() {
    var nGo int
    rand.Seed(42)
    fmt.Print("Number of Go routines: ")
    fmt.Scanf("%d \n", &nGo)
    res := make([]chan float64, nGo)
    j:=0
    for i := 0; i < nGo; i++ {  
        res[i] =numbers(1000)
    }
    for true{
        for i := 0; i < nGo;  {
            select {
                case <-res[i]:{
                    res[j]=res[i]//this line
                    j++
                }
                default:
                i++



            }
        }
        if j==nGo{
            break 
        }
    }

        fmt.Println(<-res[nGo-1])


}

В строке печати должно быть напечатано некоторое число с плавающей точкой.

1 Ответ

0 голосов
/ 31 января 2019

<-res[i] в операторе case, но по какой-то причине этот случай всегда выключается независимо от того, имеет ли канал значение

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...