go - 处理 goroutine 时的奇怪事情

标签 go println goroutine

有两件奇怪的事情。

  1. 我在 slice 中制作了 1000 个数字,但它只打印了 246,为什么是 246?为什么不是 1000?

  2. 如果我删除“log.Println("hey")"这一行,为什么它只打印0?

我知道它可能有同步问题,但我以前没有写过任何并发程序,所以有文章可以推荐吗?

import (
      "log"
      "runtime"
)

func main() {

  count := 1000
  slice := make([] int,count)
  for i := 0; i <= count-1; i++ {
   slice[i] =i
  }
  for _,v := range slice{
    go echo(v)
  }
  log.Println("hey")//if delete this line,it just print 0
  runtime.Gosched()
}


func echo(v int) {
  log.Println(v)
}

最佳答案

无法保证任何 go 例程都会在您的主例程完成之前运行。当主例程完成时,您的程序将退出,而无需等待您创建的所有 go 例程完成(甚至开始)。

解决此问题的最简单方法是分配一个同步 channel ,将其传递给每个 echo 实例,并在您的日志语句后向其写入一个标记。然后主线程应该在返回之前从该 channel 读取 count 个 token 。

关于go - 处理 goroutine 时的奇怪事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20138950/

相关文章:

google-app-engine - 如何使用 Go 运行时将 exe 文件复制到 App Engine (flex)?

java - 当循环后有 `println` 时,为什么这个循环多次的程序需要时间?

Java Print - 结束转义序列

go - 如何处理可以无阻塞增长的队列

使用 channel 时 goroutines 死锁

go - 我什么时候应该把对象放回 sync.Pool

mongodb - 如何使用官方的mongo-go-driver从mongo文档中过滤字段

go - 如何使返回变量在函数外部不被定义

go - Golang中的TCP固定大小消息成帧方法

java - C++ 中的 System.out.println 函数语法