如果包含 time.Sleep,则 Goroutine 不会执行

2023-12-04

下面的代码运行得非常好:

package main

import (
    "fmt"
)

func my_func(c chan int){
    fmt.Println(<-c)
}

func main(){
    c := make(chan int)
    go my_func(c)

    c<-3
}

游乐场_1

但是如果我改变

c<-3

to

time.Sleep(time.Second)
c<-3

游乐场_2

我的代码不执行。

我的直觉是main返回之前my_func完成执行,但似乎添加暂停应该不会有任何效果。我完全迷失在这个简单的例子中,这里发生了什么?


当。。。的时候main函数结束,程序也随之结束。它不会等待其他 goroutine 完成。

引用自Go 语言规范:程序执行:

程序执行首先初始化主包,然后调用函数main。当该函数调用返回时,程序退出。它不等待其他(非main) goroutine 来完成。

所以简单地当你main如果函数通过在通道上发送值而成功,程序可能会立即终止,然后其他 goroutine 有机会将接收到的值打印到控制台。

如果要确保将值打印到控制台,则必须将其与退出事件同步main功能:

带有“完成”通道的示例(尝试一下去游乐场):

func my_func(c, done chan int) {
    fmt.Println(<-c)
    done <- 1
}

func main() {
    c := make(chan int)
    done := make(chan int)
    go my_func(c, done)

    time.Sleep(time.Second)
    c <- 3
    <-done
}

Since done也是一个无缓冲通道,在末尾处从它接收main函数必须等待发送一个值done通道,在通道上发送值之后发生c已收到并打印到控制台。

对看似不确定的运行的解释:

Goroutine 可以并行执行,也可以不并行执行同时。同步可确保某些事件先于其他事件发生。这是你得到的唯一保证,也是你唯一应该依赖的东西。 2个这样的例子发生在之前:

  • The go启动新 goroutine 的语句发生在 goroutine 执行开始之前。
  • 通道上的发送发生在该通道的相应接收完成之前。

欲了解更多详细信息,请阅读Go 内存模型.

回到你的例子:

来自无缓冲通道的接收发生在该通道上的发送完成之前。

所以你得到的唯一保证是运行的 goroutinemy_func()将从通道接收值c来自main()。但是一旦收到该值,main功能may继续,但由于发送后没有更多语句,它只是与程序一起结束。是否非mainGoroutine 将有time or chance打印它fmt.Println() is 没有定义的.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果包含 time.Sleep,则 Goroutine 不会执行 的相关文章

  • golang从sdin扫描一行数字

    我正在尝试从标准输入读取输入 3 2 1
  • 没有公平性的DelayQueue有问题吗?

    在 Java 7 中 DelayQueue 的实现使用没有公平策略的 ReentrantLock 从长远来看 这是一个问题吗 线程会因此而饿死吗 Thanks 如果您考虑ScheduledThreadPoolExecutor 或任何其他生产
  • 使用cgo时的多重定义

    package main int add int a int b return a b import C import fmt func main func Test1 fmt Println C add 1 3 export Test2
  • 有没有一种方法可以在不停机的情况下更新 net/http 服务器中的 TLS 证书?

    我有一个简单的 https 服务器 提供一个简单的页面 如下所示 为简洁起见 没有错误处理 package main import crypto tls fmt net http func main mux http NewServeMux
  • Golang标志:忽略丢失的标志并解析多个重复的标志

    我是 Golang 新手 一直无法使用 flag 找到这个问题的解决方案 如何使用 flag 以便我的程序可以处理此类调用 其中 term 标志可能出现可变次数 包括 0 次 myprogram f flag1 myprogram f fl
  • 如何在 Visual Studio Code 中使用 Delve 调试器进行远程调试

    我已经问过了 得到了很好的答复answer https stackoverflow com questions 39058823 how to use delve debugger in visual studio code用于使用 del
  • Go中如何从json字符串中获取键值

    我想尝试从 Go 中的 JSON 获取键值 但我不确定如何操作 我已经能够使用 simplejson 读取 json 值 但是我无法找到如何获取键值 有人能指出我正确的方向和 或帮助我吗 谢谢你 您可以通过执行以下操作来获取 JSON 结构
  • 从 []byte 到 char*

    我想包装一个 C 函数 它需要一个char 指向非空字节缓冲区 的第一个元素 我正在尝试使用 CGo 将其包装在 Go 函数中 以便我可以将其传递给 byte 但我不知道如何进行转换 C 函数签名的简化版本是 void foo char c
  • 构建链代码时 ltdl.h 未找到错误

    我正在尝试使用构建链码go build 当我运行 Go build 命令时它的报告 hyperledger fabric vendor github com miekg pkcs11 pkcs11 g o 29 18 fatal error
  • 为什么奇数的切片容量与偶数的切片行为不同

    我注意到 当容量为奇数时 切片的容量会以不同的方式表现 更具体地说 当向切片添加元素时 切片的容量为doubled当原始容量为偶数时 但当原容量为奇数时 容量为增加一 然后加倍 例子 s make int 28 28 s append s
  • 如何在 Go 应用程序中处理打开/关闭数据库连接?

    我的 Web API 应用程序中有一组函数 他们对 Postgres 数据库中的数据执行一些操作 func CreateUser db err sql Open postgres user postgres password passwor
  • GoQt 致命错误:QAbstractAnimation:没有这样的文件或目录

    我尝试编译 Qt 来开发桌面应用程序 我按照 Qt 网站上的官方 wiki 指南的说明进行操作 当我尝试go run示例文件夹中的示例 我收到错误 去运行 home pinkya rabbit workspace go1programs s
  • 如何在运行“go test”时排除或跳过特定目录[重复]

    这个问题在这里已经有答案了 go test go list grep v vendor coverprofile testCoverage txt 我正在使用上述命令来测试文件 但有 1 个名为 Store 的文件夹我想从测试中排除 怎样才
  • 如何将UTC时间转换为unix时间戳

    我正在寻找将 UTC 时间字符串转换为 unix 时间戳的选项 我的字符串变量是02 28 2016 10 03 46 PM并且需要将其转换为 unix 时间戳 例如1456693426 知道该怎么做吗 首先 unix时间戳14566934
  • Guzzle 中的“并发”到底是什么?

    我没有找到太多关于concurrency选项中Pool 如果这是可以在服务器上打开的 TCP 套接字数量 那么问题是 我可以使用多少并发来更快地处理请求 我有这个使用的例子Pool I am using Laravel this is ba
  • 可能的 std::async 实现错误 Windows

    看来 std async 的 Windows 实现存在错误 在重负载下 大约每秒启动 1000 个异步线程 异步任务永远不会被调度 并且等待返回的 future 会导致死锁 请参阅这段代码 使用延迟启动策略而不是异步进行修改 Bundlin
  • 断点会停止所有线程吗?

    如果我的程序中有两个线程同时运行 并在其中一个线程上设置了断点 那么当遇到此断点时 另一个线程也会停止 还是会继续执行 我用 Java 编写并使用 NetBeans 断点可以选择它们的行为方式 挂起单个线程或所有线程
  • Golang GAE - 小胡子结构中的 intID

    这是一个Example https www dropbox com sh ur2ws1jnik6euef PjVJSwDTUc Blog Golang zip该应用程序的 关键代码在 golang code handler handler
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect

随机推荐

  • 为每个类别选择 N 条记录并按 X 排序

    我有一个包含博客文章的数据库表 我想在主页上显示每个类别的一篇 或多篇 帖子 例如按日期排序 所以我的帖子表如下所示 id title description cat filename date 我将如何创建这样的查询 我想过使用 grou
  • 如何计算正弦曲线两端的面积

    给定这个数据集 y lt c 13 16 35 40 28 36 43 33 40 33 22 5 27 31 29 25 26 31 26 24 25 29 23 4 t lt 1 24 我的目标是计算两个面积 第一个区域将仅集成来自零线
  • 使用 Grunt Uglify 进行动态映射和连接

    我正在尝试使用动态映射并使用 Grunt Uglify 连接 Javascript 文件 我有以下无法正常工作的情况 这是我的文件夹结构 javascript account custom js bills billing one js b
  • elasticsearch:如何索引仅是停用词的术语?

    我在后台使用 elasticsearch 构建了自己的小搜索 取得了很大的成功 但有一件事我在文档中找不到 我正在索引音乐家和乐队的名字 有一个名为 The The 的乐队 由于停用词列表 该乐队从未被索引 我知道我可以完全忽略停用词列表
  • 自定义注释图像仅在程序开始时旋转(Swift-iOS)

    请在这里帮助新手 iOS 开发者 所以 我有一个计时器 它定期从提供公交车实时位置的 xml 表中获取公交车的纬度和经度 我能够设置解析器 为总线运动设置动画并为总线设置自定义 箭头 图像 然而 问题是 每次获得纬度和经度的新值时 我无法旋
  • forEach 循环中的 setTimeout

    如果满足特定条件 我想延迟调用 forEach 循环中的另一个函数 但我不理解这种情况下的 setTimeout function checkName person console log checking name of person n
  • 鼠标悬停时更改映射图像热点的背景

    我有 3 个多边形的图像图 实际的图像热点是由多条曲线和边缘组成的复杂形状 img src images map gif alt HTML Map border 0
  • Python 中“dict”的内存分配是如何工作的?

    我在玩字典时发现了这个 import sys Square1 Square2 Square3 for i in range 1 8 Square1 i i 2 for i in range 1 11 Square2 i i 2 for i
  • 对象引用未设置到对象的实例[重复]

    这个问题在这里已经有答案了 我收到一个错误VB Net 未将对象引用设置为对象的实例 你能告诉我这个错误的原因是什么吗 该对象在使用前尚未初始化 在代码文件的顶部输入 Option Strict On Option Explicit On
  • 在 Objective C 中使用 for-in 循环访问特定类型的对象 [重复]

    这个问题在这里已经有答案了 我正在运行一个 for in 循环NSMutableArray 有类的实例A在数组中也有一些实际上是其子类的实例B 所以如果我只想要子类的成员B 我正在检查我得到的每个对象的类if循环体内的条件 有没有可能不写这
  • 如何在 ASP.NET Membership Cookie 中存储自定义数据

    谁能给我一个关于如何在 ASP NET 会员 cookie 中存储自定义数据的示例 或为我指明正确的方向 我需要向 cookie 添加一些自定义属性 例如 UserID 和 URLSlug 并且能够以与检索用户名相同的方式检索信息 Edit
  • 在 Python 2.7 中的 lambda 函数内使用 print 函数时出错

    我正在 Python 2 7 中运行一个简单的代码 但它给了我语法错误 hello lambda first print Hello first 报告的错误是SyntaxError invalid syntax Python 不允许在以下位
  • varchar 和 nvarchar 有什么区别?

    难道只是这样吗nvarchar支持多字节字符吗 如果是这样的话 除了存储问题之外 使用真的有什么意义吗 varchars An nvarchar列可以存储任何 Unicode 数据 Avarchar列仅限于 8 位代码页 有些人认为varc
  • 如何在内存中创建一个文本文件并在其上写入内容并在客户端中打开记事本并在其中打开该文件?

    我如何在内存中创建一个文本文件 Ram gt Save NoWhere 并在其上写入一些内容并在客户端浏览器顶部打开记事本并在其中打开该文本文件并让用户自行保存 gt 在代码后面 提前感谢 此致 你不能那样做 您所能做的就是将文件内容写入正
  • 从特殊格式的文本文件中读取数据

    我正在使用 Ashwini Chaudhary 善意建议的这种方法 将特定格式的文本文件中的数据分配给字典 keys map str strip next f split Key t 1 split t words map str stri
  • 如何处理 Cassandra 中的动态列

    我正在通过 Python 脚本将 JSON 数据加载到 Cassandra 表 但很少有 Json 文件具有比平常更多的列 目前我已经创建了包含 100 列的表并且能够插入所有列 但很少有 json 文件的列数超过 100 这要怎么处理呢
  • JSON 有时是数组有时是对象

    我正在使用一个 API 它对特定字段的响应有时是对象 有时是对象数组 我创建了一个结构来解组 json 响应 效果很好 但是 在 json 响应具有对象数组的情况下 显然解组失败 在 Go 中我该如何处理这种情况 Single Respon
  • JQuery IE

    我的 IE 有问题 我有一个具有这种样式的图层 使其透明且全屏 position absolute top 0px left 0px right 0px bottom 0px background color 000000 filter a
  • 使用 Prism 库将 ListView 项目传递给命令

    我正在尝试执行基于列表视图项目数据的方法 除此之外 只有当列表视图项的 CanExecute 方法返回 true 时 才应启用触发命令的按钮 MyCommand 和 CanExecute 这两种方法都包含在我的 ViewModel 中 不幸
  • 如果包含 time.Sleep,则 Goroutine 不会执行

    下面的代码运行得非常好 package main import fmt func my func c chan int fmt Println lt c func main c make chan int go my func c c lt