Что еще кроме гошеда? - PullRequest
       1

Что еще кроме гошеда?

0 голосов
/ 29 сентября 2018

Фрагмент кода ниже,

package main

import (
        "fmt"
        "runtime"
)

func main() {
        runtime.GOMAXPROCS(1)
        var s string
        done := make(chan bool)
        go func() {
                fmt.Scanln(&s)
                fmt.Println(s)
                done <- true
        }()

        var i int
        for i = 0; i < 1e10; i++ {
        }
        fmt.Println(i)
        <-done
}

Запустите его, быстро введите несколько символов, например abcd до окончания цикла for;наконец, ударил Enter.Насколько мне известно, в цикле for нет доступных точек доходности для Gosched для переключения основной процедуры на подпрограмму, почему он немедленно напечатал abcd даже до цикла forбыло закончено?

abcd10000000000

abcd

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Код работает как положено,

Каждая запущенная программа имеет доступ к трем файлам: stdin, stdout, stderr.

Все, что вы вводите в свой терминал,Вы пишете в файл stdin, а вывод программ записывается в stdout.

В вашем случае вы записали некоторые данные в stdin, который читается и отображается.

Если вы записали какие-то данные до того, как процесс начнет обрабатывать ввод, это то же самое, что чтение из файла.

В основном, когда программа запускается и получает достаточно ввода, она продолжается, если неполучите шанс выполнить, пока кто-то не прочитает ввод, он все еще находится в stdin.

Поскольку GOMAXPROCS не означает, что вы собираетесь запускать только одну процедуру, если она заблокирована, создается новая.GOMAXPROCS подразумевает, что в любой момент времени может быть запущен только один пользовательский поток.

0 голосов
/ 29 сентября 2018

Это случайно, вы не можете предсказать вывод.Потому что в вашем случае будет запущена подпрограмма go, а затем будет выполнен цикл for.Теперь, если процедура go завершена до того, как цикл for завершит свои итерации, она сначала напечатает значение внутри процедуры go и отправит значение по каналу done, а затем напечатает значение i.Канал done будет ожидать отправки значения по подпрограмме go.

Например, если вы попытаетесь сканировать только as, а затем быстро ввести, ваше значение сначала будет напечатано внутри подпрограммы go, а затем10000000000 будет печататься в последнем, поэтому зависит от того, будет ли подпрограмма go выполняться до завершения цикла for.

Среда выполнения может выделить больше потоков, чем значение GOMAXPROCS, для обслуживания нескольких невыполненных запросов ввода-вывода,GOMAXPROCS влияет только на то, сколько фактически может быть выполнено программ;произвольно больше может быть заблокировано в системных вызовах.

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