代码之家  ›  专栏  ›  技术社区  ›  sof

除了Gosched还有什么?

go
  •  -1
  • sof  · 技术社区  · 7 年前

    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 . 据我所知,在该区域内没有任何屈服点可用 对于 Gosched 迅速 abcd 甚至在 对于 循环结束了?

    abcd10000000000
    
    abcd
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Himanshu    7 年前

    这是随机的,你无法预测输出。因为在您的情况下,go例程将运行,然后for循环将执行。现在,如果go例程在for循环完成其迭代之前完成,那么它将首先在go例程中打印值,然后在 done i 完成 通道将等待,直到go例程向其发送值。

    例如,如果您尝试仅扫描 as 10000000000 将在最后打印,因此这取决于在for循环完成之前是否执行go例程。

    运行时可以分配的线程数超过 GOMAXPROCS 为多个未完成的I/O请求提供服务。 GOMAXPROCS 只影响一次可以实际执行多少个goroutine;在系统调用中可能会阻止任意多个。

        2
  •  0
  •   nilsocket    7 年前

    代码按预期运行,

    stdin stdout , stderr .

    文件,并将程序输出写入 stdout .

    在您的情况下,您已经向 标准 ,正在读取和显示。

    如果您在进程开始处理您的输入之前就已经写入了一些数据,那么从文件中读取也是一样的。

    标准

    自从 GOMAXPROCS 这并不意味着您将只运行一个goroutine,如果该goroutine被阻止,将创建一个新的goroutine。 意味着在任何时候,只有一个用户线程可以运行。