3

我正在尝试从 golang.org 执行一个示例:http: //tour.golang.org/#63

  • 我已更改代码以测试 Gosched 的功能。*

你可以看到那里的输出: 在此处输入图像描述

hello
hello
hello
hello
hello

但是当我将这些代码复制到我的 Mac OS X 10.8(Go 版本 1.0.3)时,输出发生了变化: 在此处输入图像描述 xxxxxx$ go version go version go1.0.3 xxxxxx$ go run goroutine.go hello world hello world hello world hello world hello世界

根据这个答案,我应该使用runtime.GoSched,但实际上我不需要。所以我相信出了点问题。

请帮我解决这个问题,非常感谢。

4

3 回答 3

4

这里的问题是你有两种不同的实现。

在本地,每次调用 fmt.Println 时,您的代码都会让给调度程序。Println 写入执行系统调用的标准输出。所有系统调用都以相同的方式生成 runtime.Gosched。

play.golang.org 是一个黑盒子。我们实际上并不知道它是如何工作的。但是,从您给出的示例中,似乎 play 在调用 fmt.Println 时不会执行系统调用。这是有道理的。他们可能用缓冲区替换了 os.Stdout 来保存打印的内容。

于 2012-11-07T03:24:30.077 回答
2

Go Tour 代码只是一个介绍性示例。代码简单且不正确。GoTour63给出以下输出(添加了行号):

1 hello
2 world
3 hello
4 world
5 hello
6 world
7 hello
8 world
9 hello

该程序应打印 10 行。请注意,10 world缺少该行。也许这是故意的,用户应该注意到这一点并调查问题的原因。语言规范中的程序执行部分说明如下:

当 main 函数返回时,程序退出。它不会等待其他(非主)goroutine 完成。

该语句解释了为什么程序打印的行数少于 10 行。

正确的 Go 程序通常使用:

于 2012-11-10T20:44:51.180 回答
0

这是因为您正在调用一个在您的编程环境之外运行的 goroutine。从字面上看,两个线程同时执行,并且输出将是随机的,这是显而易见的。

于 2016-09-19T08:36:04.533 回答