Нужна помощь, чтобы понять, почему select{} не блокирует #39; не навсегда

Я работаю над упражнением по использованию каналов для реализации очереди. В частности, я пытаюсь использовать размер канала, чтобы ограничить количество одновременных горутин. А именно, я написал следующий код:

package main

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

func runTask (t string, ch *chan bool) {
        start := time.Now()
        fmt.Println("starting task", t)
        time.Sleep(time.Millisecond * time.Duration(rand.Int31n(1500))) // fake processing time
        fmt.Println("done running task", t, "in", time.Since(start))
        <- *ch
}

func main() {
        numWorkers := 3
        files := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"}

        activeWorkers := make(chan bool, numWorkers)

        for _, f := range files {
                activeWorkers <- true
                fmt.Printf("activeWorkers is %d long.\n", len(activeWorkers))
                go runTask(f, &activeWorkers)
        }
        select{}
}

Прямо сейчас код вылетает с ошибкой:

throw: all goroutines are asleep - deadlock!

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

Итак, у меня есть двойной -вопрос :почему select не блокирует навсегда и, за исключением вызова time.Sleep ()после цикла for, как я могу избежать взаимоблокировок?

Cheers,

-mtw

5
задан Denys Séguret 13 September 2012 в 16:28
поделиться