gpt4 book ai didi

go - 除了 Gosched 还有什么?

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:20 25 4
gpt4 key购买 nike

下面的代码片段,

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
}

运行它,快速输入几个字符,例如abcdfor 循环结束之前;最后点击 Enter。据我所知,for 循环中没有可用的 yield 点用于 Gosched 将主 goroutine 切换到子例程,为什么它迅速甚至在 for 循环完成之前就打印了 abcd

abcd10000000000

abcd

最佳答案

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

例如,如果您尝试仅扫描 as 然后输入 fast 您的值将在 go 例程中首先打印,然后 10000000000 将在最后打印,因此这取决于if go 例程将在 for 循环完成之前执行。

运行时可以分配比 GOMAXPROCS 的值更多的线程来服务多个未完成的 I/O 请求。 GOMAXPROCS 只影响实际可以同时执行的 goroutine 数量;在系统调用中可能会阻塞任意更多。

关于go - 除了 Gosched 还有什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52570364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com