Golang 并发打印数字1到100每个数字由一个单独的goroutine打印
在本文中,我们将编写一个Go语言程序,使用并发的方式打印数字1到100,每个数字由一个单独的go routine打印。并发意味着同时并独立地执行多个任务,并确保系统的所有资源都得到利用。这可以通过轻量级线程和通道来实现。
语法
func make ([] type, size, capacity)
在Go语言中,make函数用于创建数组/映射,它接受要创建的变量类型、大小和容量作为参数。
步骤
- 此程序导入所需的fmt、main和sync包。
-
创建一个名为print_number的函数,它带有两个参数:数字n和一个指向sync.Wait组的指针。
-
在该函数内部,使用Println函数打印数字,并使用Done方法在打印完成时通知。
-
创建一个main函数。
-
在main函数中,初始化sync.Wait组(wg)。
-
在这一步中,使用for循环从1到100进行迭代,并在每次迭代中使用Add方法将一个Go例程添加到sync.Wait组中。
-
对于每个数字,通过调用wg.Add(1)来增加sync.Wait组计数器。
-
通过调用go print_number(i,&wg)来启动打印数字的Go例程。
-
在这一步中,使用wg.Wait()方法等待所有Go例程完成。这会阻塞程序的执行,直到sync.Wait组计数器达到零。
-
在所有Go例程完成后,程序终止。
示例1
在本文中,我们将编写一个Go语言程序,使用sync.Wait组以并发方式打印从1到100的数字,以显示Go例程的完成情况。
package main
import (
"fmt"
"sync"
)
func print_number(n int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println(n)
}
func main() {
var wg sync.WaitGroup
fmt.Println("The numbers from 1 to 100 printed concurrently are:")
for i := 1; i <= 100; i++ {
wg.Add(1)
go print_number(i, &wg)
}
wg.Wait()
}
输出
The numbers from 1 to 100 printed concurrently are:
100
51
52
53
76
26
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
64
54
55
56
57
58
59
60
61
62
63
12
1
2
3
4
5
6
7
8
9
10
11
70
65
66
67
68
69
37
77
71
72
73
74
75
31
27
28
29
30
43
38
39
40
41
42
34
32
33
35
18
13
14
15
16
17
36
46
44
45
21
19
20
23
22
24
48
47
49
50
25
示例2
在本文中,我们将编写一个Go语言程序,使用done来显示Go协程完成后并发地打印从1到100的数字。
package main
import (
"fmt"
)
func print_number(n int, done chan bool) {
fmt.Println(n)
done <- true
}
func main() {
done := make(chan bool)
fmt.Println("The numbers printed concurrently from 1 to 100 are:")
for i := 1; i <= 100; i++ {
go print_number(i, done)
}
for i := 1; i <= 100; i++ {
<-done
}
}
输出
The numbers printed concurrently from 1 to 100 are:
100
51
77
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
89
78
79
80
81
82
83
84
85
86
87
88
57
52
53
54
55
56
69
64
65
66
67
68
72
70
71
95
90
91
92
93
94
74
73
60
58
59
98
96
97
61
62
50
99
1
75
76
63
结论
我们使用两个示例编写并执行了打印1至100之间数字的程序。在第一个示例中,我们使用了sync.Wait group,在第二个示例中,我们使用了done来表示go routine的完成。