go併發編程實踐

go語言中,併發執行程序,只須要一個go關鍵字便可。編程

寫了一段測試代碼以下:多線程

package main

import (
	"fmt"
)

func main() {
   go func(){
      fmt.Println("go")
   }()
   fmt.Println("done")
}

程序輸出爲 done併發

奇怪的是,go沒有輸出。函數

講道理,輸出應該是go done,這樣纔對。測試

看了下例子,從新改寫了一下代碼:線程

package main

import (
	"fmt"
   "time"
)

func main() {
   go func(){
      fmt.Println("go")
   }()
   fmt.Println("done")
   time.Sleep(time.Second)
}

此次輸出爲:done gocode

爲什麼暫停一下,就能輸出go。進程

個人理解是,go的併發編程,實際上是多線程的,不是多進程的。多進程

mian函數是一個進程,而go啓用的,是mian下面的一個線程,當沒有暫停時,主進程結束了,go後面的函數還沒來得及執行,就被回收了。而暫停了一下,因爲計算機的執行速度很是快,哪怕只有1秒鐘,都夠線程執行了,所以可以順利的打印出「go」來。class

假設go後面執行的函數,是一個超級漫長的邏輯,很是耗時的處理流程,那麼暫停一下確定也是不行的。

測試代碼:

package main

import (
	"fmt"
   "time"
)

func main() {
   go func(){
      i:=0
      for{
         fmt.Println(i)
         i++
      }
   }()
   fmt.Println("done")
   time.Sleep(time.Second)
}

講道理,這個死循環應該要一直執行下去,可是1秒鐘後,仍是中止執行了,說明猜測是正確的。

這樣的話,若是是併發的編程,在mian最後,都須要個死循環來讓主線程一直存在,好比

for{
    time.Sleep(time.Second)
}
相關文章
相關標籤/搜索