Golang併發以及通道的使用

2021-08-24 23:06:01 字數 1448 閱讀 2144

golang最擅長的就是併發程式設計,使用golang可以很方便的進行併發程式設計。先看一段普通的**

package main

import (

"fmt"

"time"

)func foo(i int)

func main()

}

輸出為

0 will sleep

0 wake up

1 will sleep

1 wake up

2 will sleep

2 wake up

3 will sleep

3 wake up

4 will sleep

4 wake up

大概要執行25秒的時間,因為我們的foo中休眠5s,5次迴圈,去掉其他時間至少需要25秒時間執行完成。現在,我們希望併發呼叫foo函式,很簡單,使用go關鍵字建立協程(協程比執行緒的執行更加輕量級)

package main

import (

"fmt"

"time"

)func foo(i int)

func main()

time.sleep(10 * time.second)

}

在呼叫foo前使用了go,這樣就會併發執行,最後新增休眠10秒,是防止主程序結束,協程也被銷毀。下面的例子使用通道我們可以看到更優雅的解決方法。

package main

import (

"fmt"

"time"

)func foo(i int, ch chan int)

func main()

count := 0

for count < 5

}

通道屬於復合型別,我們使用make函式建立通道,通道型別是int,也就是我們可以使用該通道傳遞int型別的值。我們在主函式中向foo函式傳遞通道作為引數,當foo函式執行結束後,通過通道傳送數字1(ch

package main

import (

"fmt"

"math/rand"

)func consumer(ch

result

}func producer(ch chan

}func main()

我們在生產者和消費者之間使用ch通道傳遞資料,使用reslut通道給主函式返回結果。注意觀察consumer函式和producer函式的引數列表,這裡通道引數的傳遞略有不同,指明了通道的方向,chan

可以看到,go語言實現併發非常簡單,借用通道,又可以在不同的協程之間方便的傳輸資料。

Golang 併發以及通道的使用方式

golang最擅長的就是併發程式設計,使用golang可以很方便的進行併發程式設計。先看一段普通的 package main import f time func foo i int func main 輸出為0 will sleep 0 wake up 1 will sleep 1 wake up...

Golang併發 goroutine和通道

goroutine 和通道 channel 實現的通訊順序程序 csp 模式 共享記憶體多執行緒模式 goroutine goroutine指每乙個併發執行的活動。main函式在主goroutine中執行。goroutine通過go關鍵字建立。gof 新建乙個goroutine呼叫f go語句本身立...

Golang併發控制 context的使用

我們已經知道waitgroup可以用於併發控制,但當遇到更複雜的場景時,例如主動取消goroutine或者使超時的goroutine自動退出等,waitgroup就無能為力。這個時候,就是context大有用武之地。包context定義了context型別,它跨api邊界和程序之間攜帶截止日期,取消...