只需在要讓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
)
waitgroupwaitgroup 用於實現工作池
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()
mutexpackage 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 語言裡,你可以使用通道來傳送和接收需要...