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")
}
}
複製代碼