這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
我們寫C 的時候,假如用到多進程,我們通常都會用訊號,管理等來進程進程間的通訊, 那麼golang是怎麼實現這個的呢?? 直接看碼說話吧
package mainimport ( "fmt" "time")func main() { timeout := make(chan bool, 1) go func() { fmt.Println("------------ 子進程1--------------") t1 := time.Now().UnixNano() fmt.Println(t1) fmt.Println("這個一定會執行") time.Sleep(3 * time.Second) // timeout <- true timeout <- true }() fmt.Println("首先邏輯還是響應 main 函數") go func() { fmt.Println("------------ 子進程2--------------") t2 := time.Now().UnixNano() fmt.Println(t2) fmt.Println("相當於fork一個子進程在進行") }() ch := make(chan int) select { case <-ch: case <-timeout: fmt.Println("------------ 回到main函數 --------------") fmt.Println("task is timeout!") } fmt.Println("main 函數本身的輸出")}
我們執行代碼看一看結果
首先邏輯還是響應 main 函數------------ 子進程2--------------1471577916141068800相當於fork一個子進程在進行------------ 子進程1--------------1471577916142068800這個一定會執行------------ 回到main函數 --------------task is timeout!main 函數本身的輸出
分別從 納秒的時間戳記可以看出, 兩個 go func() 幾乎是同時執行的, 這種是golang平行處理的寫法, 是直接調用系統的epoll處理流程, golang同樣提供了一種監視手段去監視每個平行處理邏輯的返回, select就是這種手段