在围棋教程中,我们有一张幻灯片:Goroutines

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}

运行这段代码会产生预期的结果("world"和"hello"交替写入屏幕5次).

但是,如果我们注释掉time.Sleep(因此,也就是导入的第"time"行)并再次运行程序,屏幕上会写上5次only个"hello".

time.Sleep有什么重要之处,能让猩猩免于死亡?

推荐答案

如果你go 掉time.Sleep,你就不会给say("world")大猩猩一个奔跑的机会.Goroutine调度程序不是抢占式的.你的大猩猩必须在另一个大猩猩跑之前放弃控制.放弃控制权的一种方式是跑time.Sleep米.

如果从say函数中取出time.Sleep,那么主goroutine将运行5次,而不放弃对次goroutine的控制,然后当主goroutine从say返回时,程序将退出,因为没有任何东西可以让程序保持活动状态.

Go相关问答推荐

Docker容器之间的连接被拒绝

运行add. inf,这样我们就可以在app.conf中使用. inf参数了?

具有GRPC的RBAC(基于角色的访问控制)-网关生成的REST风格的API

使用ciph.AEAD.Seal()查看内存使用情况

创建使用逗号而不是加号分隔OU的CSR

exec的可执行决议.命令+路径

如何在gofiber/websocket/v2中设置状态代码和原因

我可以在Golang中的另一个类型参数的基础上约束一个类型的参数吗?

Golang Fiber Render - 将数据发送到多个布局

在 Go 中解组编号的 XML 标签

在本地 go 应用程序上获取秘密的正确策略

上传图片失败,出现错误dial tcp: lookup api.cloudinary.com: no such host

Golang 中具体类型的错误片段

如何过滤来自 fsnotify 的重复系统消息

如何为导入的嵌入式 struct 文字提供值?

对所有标志进行 ORing 的简短方法

Gorm 在保存/创建时序列化 struct

Golang ACMEv2 HTTP-01 挑战不挑战服务器

如何在 docker 文件中安装 golang 包?

如何扩充 ResponseWriter 的 Header() 返回的 map