- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
09.2.2 创建多个 Goroutine
在本小节中,您将学习如何创建任意数量的Goroutine。本节中展示的程序文件为create.go。它将分为四个部分,它将允许您创建动态数量的Goroutine,而且Goroutine的数量将以命令行参数的形式传递给程序,我们将使用flag来处理和解析命令行参数。
create.go的第一部分代码如下:
import ( "flag" "fmt" "time" )
create.go的第二部分代码如下:
func main() { n := flag.Int("n", 10, "Number of goroutines") flag.Parse() count := *n fmt.Printf("Going to create %d goroutines.\n", count)
上面的代码读取命令行选项n的值,该选项决定了我们将要创建的Goroutine的数量。
create.go的第三部分代码如下:
for i := 0; i < count; i++ { go func(x int) { fmt.Printf("%d ", x) }(i) }
for循环用于创建所需数量的Goroutine。需要再次注意的是,您不能对它们被创建和执行的顺序做出任何假设和期望。
create.go的最后一部分代码如下:
time.Sleep(time.Second) fmt.Println("\nExiting...") }
为了能看到程序的输出,我们使用time.Sleep()函数来为Goroutine提供足够的时间以便能完成它们的工作。但在实际编程中,我们都希望Goroutine能尽快执行完成,所以并不需要time.Sleep()语句,后面我们将学习一种更好的技巧来保证在main()函数返回之前让所有的Goroutine执行完成。
多次执行create.go的输出如下:
$ go run create.go -n 100 Going to create 100 goroutines. 5 3 2 4 19 9 0 1 7 11 10 12 13 14 15 31 16 20 17 22 8 18 28 29 21 52 30 45 25 24 49 38 41 46 6 56 57 54 23 26 53 27 59 47 69 66 51 44 71 48 74 33 35 73 39 37 58 40 50 78 85 86 90 67 72 91 32 64 65 95 75 97 99 93 36 60 34 77 94 61 88 89 83 84 43 80 82 87 81 68 92 62 55 98 96 63 76 79 42 70 Exiting... $ go run create.go -n 100 Going to create 100 goroutines. 2 5 3 16 6 7 8 9 1 22 10 12 13 17 11 18 15 14 19 20 31 23 26 21 29 24 30 25 37 32 36 38 35 33 45 41 43 42 40 39 34 44 48 46 47 56 53 50 0 49 55 59 58 28 54 27 60 4 57 51 52 64 61 65 72 62 63 67 69 66 74 73 71 75 89 70 76 84 85 68 79 80 93 97 83 82 99 78 88 91 92 77 81 95 94 98 87 90 96 86 Exiting...
同样,您可以看到输出是乱序的。另外,如果你没有用time.Sleep()来保证合适的延迟,你将无法看到Goroutine的输出。
在下一节中,您将学习如何在程序结束之前让你的Goroutine有足够的时间来完成他们正在做的事情,而不再需要调用time.Sleep()。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论