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