GO特有 gorouting 通道

2021-10-02 11:33:45 字數 2864 閱讀 9621

只需在要讓goroutine執行的函式或方法前加上關鍵字go即可

啟動乙個新的協程時,會立即返回執行下一行**,忽略該協程返回的任何值

go通過channel實現協程間的通訊

channel 是有型別的管道,採用關鍵字chan 加上型別做宣告。賦值取值採用符號」<-「

和 map 與 slice 一樣,channel 使用前必須建立:

var ch chan

int//宣告通道

ch :=

make

(chan

int)

單向通道
package main

import

"fmt"

//send only

func

func1

(ch chan

<-

int)

func

main()

for range 遍歷channel

package main

import

"fmt"

func

produce

(ch chan

int)

close

(ch)

}func

produce1

(ch chan

int)

close

(ch)

}func

main()

fmt.println(v)

}*/// for range 用於在乙個通道關閉之前,從通道接受資料

for v :=

range ch

}

通過make建立channel時,指定capacity,可以建立緩衝通道。示例如下:

ch :=

make

(chan

int,

1024

)

waitgroup
waitgroup 用於實現工作池

package main

import

("fmt"

"sync"

"time"

)// 注意這裡waitgroup採用的是傳位址的方式。若採用傳值,每個子協程會得到乙份waitgroup的拷貝,程式不能正常結束

func

process

(i int

, wg *sync.waitgroup)

func

main()

wg.wait()

// 阻塞等待,直到所有協程結束

fmt.

println

("done"

)}

工作池
工作池核心功能如下:

- 在主協程中建立乙個工作池,監聽乙個等待輸入型作業緩衝通道

- 將作業新增到該輸入型緩衝通道中

- 作業完成後,再將結果寫入乙個輸出型緩衝通道

- 從輸出型通道讀取並列印結果

package main

import

("fmt"

"math/rand"

"sync"

"time"

)type job struct

type result struct

var jobs =

make

(chan job,10)

var results =

make

(chan result,10)

func

digits

(num int

)int

return sum

}func

worker

(wg *sync.waitgroup)

results <- output

} wg.

done()

}// 建立工作池

func

createworkerpool

(noofworkers int

) wg.

wait()

close

(results)

}//建立作業

func

allocate

(noofjobs int

) jobs <- job

}close

(jobs)

}func

result

(done chan

bool

) done <-

true

}func

main()

mutex
package main

import

("fmt"

"sync"

)var x =

0func

incr

(wg *sync.waitgroup, mutex *sync.mutex)

// 利用通道代替互斥量機制

func

incr2

(group *sync.waitgroup,ch chan

bool

)func

main()

wg.wait()

fmt.

println

(x)}

go 通道 go語言通道channel

通過使用通道,在多個goroutine傳送和接受共享的資料,達到資料同步的目的。通道,他有點像在兩個routine之間架設的管道,乙個goroutine可以往這個管道裡塞資料,另外乙個可以從這個管道裡取資料,有點類似於我們說的佇列。宣告乙個通道很簡單,我們使用chan關鍵字即可,除此之外,還要指定通...

Go 緩衝通道

語法結構 cap為容量 ch make chan type,cap 通道是非同步的,是一種在被建立時就被開闢了能儲存乙個或者多個值的通道。這種型別並不要求傳送與接收同時進行。只要緩衝區有未使用空間用於傳送資料,或還包含可以接收的資料,那麼其通訊就會無阻塞地進行。只有在通道中沒有要接收的值時,接收動作...

go語言通道插入0 Go 語言通道

51reboot 運維開發 golang 課程 k8s 課程 python 自動化高階課程 python 基礎實戰課程 運維前端課程 課程試聽預約請掃碼 原子函式和互斥函式都能工作,但是依靠它們都不會讓編寫併發程式變得更簡單,更不容易出錯,或者更有趣。在 go 語言裡,你可以使用通道來傳送和接收需要...