Golang使用CSP模型實現併發,goroutine和channel即分別對應CSP模型中的Process和Channel。不一樣於多線程併發模型須要在競態情形(race condition)下,經過複雜的鎖機制確保資源正確使用。goroutine之間可使用channel進行通訊。Channel能夠當作一個 FIFO 隊列,對 FIFO 隊列的讀寫都是原子的操做,不須要加鎖。html
go func() { // 開啓Goroutine fmt.Println("Hello World!") }() 複製代碼
channel := make(chan int) // 建立Channel channel := make(chan int) // 建立Channel channel := make(chan int) // 建立Channel buffered_channel := make(chan int, 2) // 建立帶有緩衝的Channel close(channel) // 關閉Channel 複製代碼
package main import ( "fmt" "time" ) func main() { channel := make(chan int) // 建立Channel go func() { // 開啓Goroutine time.Sleep(1000000000) channel <- 1 // 向Channel發送數據 }() result := <-channel // 接收Channel中的數據 fmt.Println(result) } 複製代碼
package main import ( "fmt" "time" ) func main() { channel1 := make(chan int) // 建立Channel1 channel2 := make(chan int) // 建立Channel2 go func() { // 開啓Goroutine1 time.Sleep(1000000000) channel1 <- 1 // 向Channel1發送數據 }() go func() { // 開啓Goroutine2 time.Sleep(100000000) channel2 <- 2 // 向Channel2發送數據 }() select { // 同時等待接收Channel1和Channel2的數據,只要有一個就緒,即完成對應case的處理 case result := <-channel1: fmt.Println(result) case result := <-channel2: fmt.Println(result) } } 複製代碼
package main import ( "fmt" "time" ) func main() { channel := make(chan int) // 建立Channel go func() { for i := 0; i < 10; i++ { time.Sleep(1000000000) channel <- i // 不斷向Channel發送數據 } close(channel) // 關閉Channel }() for result := range channel { // 迭代Channel中的數據,並打印出來 fmt.Println(result) } } 複製代碼
package main import ( "fmt" "time" ) func main() { channel := make(chan int) // 建立Channel go func() { // 開啓Goroutine time.Sleep(1000000000) channel <- 1 // 向Channel發送數據 }() select { case result := <-channel: // 接收Channel中的數據 fmt.Println(result) case <-time.After(100000000): fmt.Println("time out") } } 複製代碼