Go语言程序,并发打印1到100的数字,每个数字由一个单独的goroutine打印


在这篇文章中,我们将编写一个Go语言程序,并发地打印从1到100的数字,每个数字由一个单独的goroutine打印。并发意味着并行且独立地执行多个任务,并确保利用系统的所有资源。这可以通过goroutine(轻量级线程)和通道来实现。

语法

func make ([] type, size, capacity)

Go语言中的make函数用于创建数组/映射,它接受要创建的变量类型、大小和容量作为参数。

算法

  • 此程序导入fmt、main和sync作为必要的包。

  • 创建一个名为print_number的函数,该函数有两个参数:数字n和指向sync.WaitGroup的指针。

  • 在这个函数内部,使用Println函数打印数字,并在打印完成后使用Done方法发出通知。

  • 创建一个main函数。

  • 在main函数中,初始化sync.WaitGroup(wg)。

  • 在此步骤中,使用for循环迭代从1到100,并在每次迭代中使用Add方法向sync.WaitGroup添加一个goroutine。

  • 对于每个数字,通过调用wg.Add(1)来递增sync.WaitGroup计数器。

  • 通过调用go print_number(i, &wg)启动goroutine来打印数字。

  • 在此步骤中,使用wg.Wait()方法等待所有goroutine完成。这会阻塞程序的执行,直到sync.WaitGroup计数器达到零。

  • 所有goroutine完成后,程序终止。

示例1

在这篇文章中,我们将编写一个Go语言程序,使用sync.WaitGroup并发地打印从1到100的数字,以显示goroutine的完成情况。

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并发地打印从1到100的数字,以显示goroutine的完成情况。

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.WaitGroup,在第二个示例中,我们使用了done来表示goroutine的完成。

更新于:2023年8月4日

652 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告