почему select {} vs select {case} вызывают другое планирование - PullRequest
0 голосов
/ 11 апреля 2019

1.выбрать {case}

    "fmt"
    "runtime"
    "time"
)

func main() {
    runtime.GOMAXPROCS(1)

    go func() {
        fmt.Println("a")
    }()
    go func() {
        fmt.Println("b")
    }()
    go func() {
        fmt.Println("c")
    }()

    fmt.Println("d")

    select {
    case _ = <-time.After(time.Second):
    }
}

result:dabc

2.select {}

package main
import (
    "fmt"
    "runtime"

)
func main() {
    runtime.GOMAXPROCS(1)

    go func() {
        fmt.Printf("a")

    }()

    go func() {
        fmt.Printf("b")

    }()

    go func() {
        fmt.Printf("c")

    }()

    fmt.Printf("d")
    select {}

}

result:dcab

Поскольку я установил «runtime.GOMAXPROCS (1)», в моей программе есть только один «Процессор».

Один «Процессор» имеет только один «runq», а операция ввода / вывода - «FIFO»

У меня вопрос "почему всегда ... не рэнд ...."

1 Ответ

0 голосов
/ 12 апреля 2019

Наконец-то разобрался.

Processor.runq - это FIFO, здесь есть еще одна переменная (runnext), runnext сохраняет последнюю процедуру, которая будет обрабатываться далее.

Последний запуск программы p .runnext

Таймер создает порядок, и этот запуск запускает p .runnext.


Процессор run runnext 被 定时器 创建Я использую рутину, я люблю рутину, FIFO

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