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) }