我们编写了一个 worker 函数,简单地把某个字符创打印 10 遍。然后在 main 函数中启动两个 goroutine,分别打印 hello 和 world 字符串。运行程序我们期望在终端交替看到两个单词的出现,直到打印完毕。可以看到,和普通的程序相比, 我们不需要依赖额外的库,只是添加了两个 go 关键字就把顺序执行的程序变成了并发执行,这也许是很多人说 go 并发编程简单的原因吧。
如果上面的程序保存为 main.go,执行 go run main.go 来运行,你会发现终端上什么都没有打印。这是为什么?不是说很简单吗,为什么上来就遇到问题?
虽然 go 语言提供了语言级别特性让并发编程变得简单,但是想要编写正确高效的并发代码并不是件容易的事情,我们还是 要了解 goroutine 的各种特性,并认真设计代码逻辑。对于这里遇到的第一个问题,答案在于 main 函数本身也是一个 goroutine, 创建完两个 goroutine 之后,main 函数就运行结束并退出,而不会等待它创建的 goroutine 运行完成。因此 **两个 woker goroutine 还没有运行,main 函数就退出了,**所以我们自然看不到输出。
知道了问题,解决的思路就是让 main 函数等待两个 goroutine 运行结束再退出。提到等待,最容易的想法是在程序中 sleep 一段时间,所以把上面的代码修改一下:
再次执行,你会在终端看到期望的输出结果:hello 和 world 交替出现,而且运行多次会发现输出的顺序也不是不断变化的。