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的完成。