程序運(yùn)行后,雖然mian函數(shù)和ready函數(shù)中都print了開(kāi)始執(zhí)行的語(yǔ)句,但是很明顯,在Goroutine內(nèi)的函數(shù)并沒(méi)有執(zhí)行完成。所以我們?yōu)榱烁珳?zhǔn)的控制Goroutine的并發(fā),需要使用Channel進(jìn)行控制。
基本概念
Goroutine是一個(gè)被Go運(yùn)行時(shí)管理的輕量級(jí)線程(A goroutine is a lightweight thread managed by the Go runtime)。
為什么沒(méi)有采用現(xiàn)有的表示并發(fā)名詞來(lái)解釋Go語(yǔ)言中的并發(fā)呢?因?yàn)楝F(xiàn)有的線程、協(xié)程、進(jìn)程等都無(wú)法準(zhǔn)確表達(dá)Goroutine。
Goroutines使用方法
函數(shù)并發(fā)執(zhí)行
與普通函數(shù)類似,我們調(diào)用Goroutines時(shí)只需要在函數(shù)前加上go關(guān)鍵字。下面的例子中g(shù)o ready()就會(huì)并發(fā)執(zhí)行。
package main
import (
"fmt"
"time"
)
func ready() {
fmt.Println("Run func in a goroutine")
}
func main() {
go ready()
time.Sleep(time.Second * 3)
fmt.Println("Main function done")
}
匿名并發(fā)函數(shù)
如果你不想單獨(dú)定義,則可以使用匿名方式
package main
import (
"fmt"
"time"
)
func main() {
go func() {
fmt.Println("Run anonymous func in goroutine.")
}()
time.Sleep(time.Second * 3)
fmt.Println("Main function done")
}
如何控制并發(fā)
上面的示例中,我們?cè)谥骱瘮?shù)刻意的等待了3秒,如果沒(méi)有這3秒會(huì)發(fā)生什么呢?我們將time.Sleep注釋掉,另外由于time模塊沒(méi)有使用,也需要注釋掉
package main
import (
"fmt"
//"time"
)
func ready() {
fmt.Println("Run func in a goroutine")
}
func main() {
go ready()
//time.Sleep(time.Second * 3)
fmt.Println("Main function done")
}
此時(shí)我們發(fā)現(xiàn)Goroutine好像并沒(méi)有執(zhí)行,因?yàn)橹挥衜ain函數(shù)中print語(yǔ)句輸出了結(jié)果:
那么究竟Goroutine到底有沒(méi)有被觸發(fā)呢?我們?cè)偻ㄟ^(guò)這個(gè)例子看一下,這個(gè)例子中,main函數(shù)需要等待2秒,而Goroutine內(nèi)執(zhí)行的函數(shù)則需要等待5秒
package main
import (
"fmt"
"time"
)
func ready(s int) {
fmt.Printf("Run func in a goroutine and wait for %v\n", s)
time.Sleep(time.Second * time.Duration(s))
fmt.Printf("Run func in a goroutine and wait for %v end\n", s)
}
func main() {
mainWaitSec := 2
go ready(5)
fmt.Printf("Run Main function and wait for %v\n", mainWaitSec)
time.Sleep(time.Second * time.Duration(mainWaitSec))
fmt.Printf("Run Main function and wait for %v done\n", mainWaitSec)
}
程序運(yùn)行后,雖然mian函數(shù)和ready函數(shù)中都print了開(kāi)始執(zhí)行的語(yǔ)句,但是很明顯,在Goroutine內(nèi)的函數(shù)并沒(méi)有執(zhí)行完成。所以我們?yōu)榱烁珳?zhǔn)的控制Goroutine的并發(fā),需要使用Channel進(jìn)行控制。
Run Main function and wait for 2
Run func in a goroutine and wait for 5
Run Main function and wait for 2 done