当前位置: 首页 > 面试题库 >

为什么需要time.sleep运行某些goroutine?

能可人
2023-03-14
问题内容

在GO教程中,我们有这张幻灯片: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"是导入行)并再次运行该程序, 则只剩下 “ hello”被写入屏幕五次了。

有什么重要的意义time.Sleep可以使goroutine免于死亡?


问题答案:

如果将其删除,time.Sleep则不会给say("world")goroutine运行的机会。goroutine调度程序不是抢占式的。您的goroutine必须放弃控制才能运行另一个goroutine。放弃控制的一种方法是奔跑time.Sleep

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



 类似资料:
  • 完整的错误消息:JDK丢失,并且是运行某些NetBeans模块所必需的。请使用--jdkhome命令行选项指定JDK安装,或查看http://wiki.NetBeans.org/faqrunningonjre以获取更多信息。 一些细节:我刚刚第一次在Linux mint上安装Netbeans。当我启动它时,当它打开模块时,会出现这个错误消息。但我确实安装了jdk。 $Java-版本 $javac-

  • 问题内容: 我在Windows 7(64位)计算机上使用Java已经有一段时间了,并且从未遇到无法创建网络连接的问题。现在,在我正在工作的公司的系统上,我需要设置“ -Djava.net.preferIPv4Stack = true”,否则java进程似乎无法创建单个连接。 缺点是,如果我未设置“ _JAVA_OPTIONS”,则必须配置大量服务才能使用此设置。但是,如果我使用它,Java会向st

  • 嗨, 我是Spring boot gradle项目的新手。我正在尝试用Spring boot应用程序运行flyway迁移。这就是我在gradle中设置依赖项的方式, 首先,我将依赖项添加为。这足以暴露一个终点。 然后我尝试以的方式添加flyway依赖项,它既没有抛出错误,也没有运行迁移脚本,直到我添加了依赖项。在查看了data-jpa jar的pom.xml之后,我确定了这个jar的hiberna

  • 问题内容: 据说Golang是 编译 语言,但它是什么意思由 编译 ?如果golang应用程序已编译为机器代码,为什么我不能只分发二进制文件(当然是在相应的arch和平台上)而不是分发东西? 问题答案: 编译二进制文件后, 可以 将其分发到具有相同体系结构的计算机上。 等只是编译所必需的。

  • 互联网是超文本标记语言(HTML)页面的集合,它们彼此链接以形成概念性信息网络。随着时间的推移,静态资源数量增加,图像等更丰富的项目开始成为Web结构的一部分。 高级服务器技术允许动态服务器页面 - 其内容基于查询生成的页面。 很快,需要拥有更多动态网页才能获得动态超文本标记语言(DHTML)。一切都归功于JavaScript。在接下来的几年中,我们看到了跨帧通信,试图避免页面重新加载,然后在帧内

  • 当前信息时代,哪里都是应用程序。这些应用程序们不仅仅是运行人们工作场所的工具 - 它们现在正在经营人们的生活。 对即时响应的需求,完美的行为和更多的功能是前所未有的。 而且,当然,人们期望应用程序在不同类型的设备上运行平稳,特别是在移动设备上。 应用程序执行的速度与它所做的一样重要。 NGINX的核心功能,例如其具有高性能HTTP和反向代理服务器的大规模可扩展事件驱动架构,访问和带宽控制以及与各种