Go并发和通道混乱

2023-11-21

我是 Go 新手,在理解并发和通道方面遇到问题。

package main

import "fmt"

func display(msg string, c chan bool){
    fmt.Println("display first message:", msg)
    c <- true
}

func sum(c chan bool){
    sum := 0
    for i:=0; i < 10000000000; i++ {
        sum++
    }
    fmt.Println(sum)
    c <- true
}

func main(){
    c := make(chan bool)

    go display("hello", c)
    go sum(c)
    <-c
}

程序的输出是:

display first message: hello
10000000000 

但我认为应该只有一行:

display first message: hello

因此,在 main 函数中,

display 和 sum 同时运行,并且 sum 需要更长的时间,因此 display 应将 true 发送给 c,并且程序应在 sum 完成之前退出...

我不确定我是否理解清楚。有人可以帮我解决这个问题吗?谢谢你!


程序的确切输出未定义,取决于调度程序。调度器可以在当前未被阻塞的所有 goroutine 之间自由选择。它试图通过在很短的时间间隔内切换当前的 goroutine 来同时运行这些 goroutine,以便用户感觉到一切都同时发生。除此之外,它还可以在不同的CPU上并行执行多个goroutine(如果你碰巧有一个多核系统并且增加了运行时.GOMAXPROCS)。可能导致输出的一种情况是:

  1. main创建两个 goroutine
  2. 调度程序选择立即切换到新的 goroutine 之一并选择display
  3. display打印出消息并被通道发送阻塞(c <- true)因为还没有接收器。
  4. 调度程序选择运行sum next
  5. 计算总和并打印在屏幕上
  6. 调度程序选择不恢复sumgoroutine(它已经使用了相当长的时间)并继续display
  7. display将值发送到通道
  8. 调度程序选择接下来运行 main
  9. main 退出并且所有 goroutine 都被销毁

但这只是一种可能的执行顺序。还有很多其他的,其中一些会导致不同的输出。如果您只想打印第一个结果并随后退出程序,您可能应该使用result chan string并改变你的main打印功能fmt.Println(<-result).

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

Go并发和通道混乱 的相关文章

  • 在 Go 中执行字节数组

    我正在尝试在 Go 程序中执行 shellcode 类似于使用其他语言执行此操作的方式 示例 1 C 程序中的 Shellcode https stackoverflow com questions 16626857 shellcode i
  • 使用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
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • Go中如何自定义http.Client或http.Transport超时重试?

    我想实现一个自定义http Transport对于标准http Client 如果客户端超时 它将自动重试 附 由于某种原因 习俗http Transport is a 一定有 我已经查过了hashcorp go retryablehttp
  • Java Executor 根据 CPU 和 RAM 使用情况调整线程池

    我的应用程序使用 Executor 为大量任务提供线程池 通过分析和基准测试 我确定当每个核心有多个线程时 我的应用程序运行速度最快 一个好的启发式方法是从每个核心 4 个线程开始 不断变化 直到达到 gt 90 CPU 或 gt 90 R
  • 是否可以获取有关 Golang 中调用者函数的信息?

    是否可以获取有关 Golang 中调用者函数的信息 例如 如果我有 func foo Do something func main foo 我怎样才能得到那个foo已被呼叫来自main 我可以用其他语言实现这一点 例如在 C 中我只需要使用
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • 如何解析 Content-Disposition 标头以检索文件名属性?

    使用 go 如何解析从 http HEAD 请求检索到的 Content Disposition 标头以获取文件的文件名 此外 如何从 http HEAD 响应中检索标头本身 这样的事情正确吗 resp err http Head http
  • 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 的文件夹我想从测试中排除 怎样才
  • 展平嵌套结构会导致切片的切片

    所以我有一个像这样的结构 type Bus struct Number string Name string DirectStations Station Station is another struct ReverseStations
  • 如何将UTC时间转换为unix时间戳

    我正在寻找将 UTC 时间字符串转换为 unix 时间戳的选项 我的字符串变量是02 28 2016 10 03 46 PM并且需要将其转换为 unix 时间戳 例如1456693426 知道该怎么做吗 首先 unix时间戳14566934
  • 匿名结构和空结构

    http play golang org p vhaKi5uVmm http play golang org p vhaKi5uVmm package main import fmt var battle make chan string
  • 解组转义 XML

    在 Go 中 我将如何解码此 XML 响应 我尝试过建立一个自定义UnMarshal方法在我的Answerstruct 但我运气不太好
  • 打印到 stdout 会导致阻塞的 goroutine 运行吗?

    作为一个愚蠢的基本线程练习 我一直在尝试实现理发师睡觉的问题 http en wikipedia org wiki Sleeping barber problem在戈兰 对于通道来说 这应该很容易 但我遇到了一个 heisenbug 也就是
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • 如何将 SQLite 数据库捆绑到 Go 二进制文件中?

    我尝试使用 go bindata 和 packr 但这些包没有显示如何将 SQLite 数据库文件打包到二进制文件中 我不需要以任何方式更新数据库 我只想在启动时从中读取数据 如何将 SQLite 数据库文件嵌入到 Go 二进制文件中 SQ
  • Laravel - 停止并发访问记录

    在 Laravel 中 有什么方法可以停止同时与同一条记录交互 例如 如果用户 A 正在编辑一条记录 那么我同时需要阻止用户 B 编辑同一条记录 注意 我在 Laravel 5 2 中使用 SESSION DRIVER file 目前大约有

随机推荐

  • 为强制定向网络中的每个链接指定颜色,networkD3::forceNetwork()

    问题是根据链接的值或权重指定两种不同的颜色networkD3 forceNetwork在 R 中 例如 Blue对于大于1的链接权重 dark对于小于 1 的链接权重 示例代码 复制自here the forceNetwork部分 libr
  • 为什么 Ruby 似乎随机访问目录中的文件?

    这是设计使然吗 这是代码 class FileRenamer def RenameFiles folder path files Dir glob folder path end end puts Renaming files rename
  • Java Swing GUI 的自动化测试 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有哪些选项可以为用 Java Swing 编写的 GUI 构建自动化测试 我想测试一些使用以下代码编写的 GUINetBeans Swing GUI
  • 惰性洗牌算法

    我有一个很大的元素列表 我想以随机顺序迭代它们 但是 我无法修改该列表 也不想创建它的副本 因为 1 它很大 2 可以预期迭代会提前取消 List
  • 解析 XPath 表达式

    我正在尝试为 XPath 创建一个 AET 抽象表达式树 因为我正在编写一个 WYSIWYG XSL 编辑器 在过去的三到四个小时里 我一直在与 XPath BNF 碰头 我想到了另一个解决方案 我想我可以编写一个实现 IXPathNavi
  • 在 Android 中禁用屏幕锁定(电源)按钮

    我希望当我的应用程序运行电源按钮时 按下该按钮会锁定屏幕并且屏幕变黑 应该被禁用 使用户无法锁定屏幕 我在三星 Galaxy S 手机的默认相机应用程序中注意到了这个东西 这也是我尝试做同样事情的原因 我还有一个与相机相关的应用程序 试试这
  • vim 显示两行选项卡

    当你同时打开很多文件时 Vim 是否可以显示两行选项卡 我不希望出现选项卡溢出样式的箭头 这不完全是你所要求的 但我从使用选项卡切换到使用 BufExplorer 在它们之间切换的普通旧式多个缓冲区 http www vim org scr
  • 比较 VBA 中的日期

    我有两个文本框 有两个不同的日期 orderDate 和 receiveDate 收到的日期需要手动输入到表单中 我想包括在 orderDate 之后应该发生 receiveData 的验证 我已经尝试过 If txtRecievedDat
  • 使用相机拍摄的照片不包含任何 ALAsset 元数据

    最奇怪的事情正在发生 我有一个操作表 用户可以选择使用相机拍照或从相机胶卷中选择一张照片 当 UIImagePicker 从选择返回时 我使用 ALAssetsLibrary 来确定照片中嵌入的 GPS 信息 从相机胶卷中选择照片效果非常好
  • Beautifulsoup,达到最大递归深度

    这是一个beautifulsoup抓取所有内容的过程 p html 标签 从某些网页抓取内容后 我收到一条错误消息 指出超出了最大递归深度 def printText tags for tag in tags if tag class Na
  • 使用curl在PHP中获取HTTP代码

    我使用 CURL 来获取站点的状态 如果它是向上 向下或重定向到另一个站点 我想让它尽可能精简 但效果不佳 我把它包装在一个函数中 它工作正常 但性能不是最好的 因为它下载整个页面 如果我删除 output curl exec ch 它返回
  • 如何拦截网络请求

    有没有类似 Chromium 的东西chrome webRequestSafari 扩展 我浏览了他们的文档here 我能找到的最接近的东西是SafariBeforeNavigateEvent 这将阻止新页面加载 但仍会将请求发送到服务器
  • python-C++ 扩展可以获取 C++ 对象并调用其成员函数吗?

    我正在编写一个 python C 应用程序 它将从 python 调用 C 扩展中的方法 假设我的 C 有一个类 class A private int i public A int i i i int get i return i A a
  • 如何使用 Google 地方信息获取地名数组?

    我正在尝试访问 Google 地方信息以返回围绕纬度和经度的 50 个餐厅名称的数组 但在提出请求时遇到了困难 我已经有了确定用户纬度和经度的代码 并且我已经从 Google 获得了 API 密钥 我只是不知道如何通过 URL 发出请求 而
  • 如何访问作为 RMarkdown 文档中参数传递的文件中的数据?

    遵循 RMarkdown 的最后一个示例参数化报告页面 我正在尝试使用Shiny界面选择我的输入文件 其中包含以下代码YAML标头 params data input file label Input dataset value myDat
  • 模拟 DbContext.Set()?

    我们首先使用 EF 代码 并为我们的销售数据库提供数据上下文 此外 我们还有一个类位于数据上下文之上并执行一些基本的 CRUD 操作 例如 我们有以下函数 public static T Create
  • cv2.VideoCapture.read() 在 time.sleep() 之后获取旧帧

    我尝试用 Python 捕捉 立体 图像opencv和两个摄像头 因此每 5 秒应保存一张图像 但这里的问题是保存了旧框架 缩小后的代码如下 cap cv2 VideoCapture 0 for i in range 20 time sle
  • python导入站点失败

    当我执行python脚本时 出现这个问题 import site failed use v for traceback 所以我再次尝试使用 v 选项 我可以得到这些消息 import site failed traceback Traceb
  • Webpack 2:如何排除除以下之外的所有node_modules

    我需要让 babel 运行 node modules identicons 但是我仍然想排除所有其他包 原因是标识符包正在使用模板字符串并在运行时中断 webpack p 有问题的字符串 node modules identicons in
  • Go并发和通道混乱

    我是 Go 新手 在理解并发和通道方面遇到问题 package main import fmt func display msg string c chan bool fmt Println display first message ms