做網(wǎng)站需要知道什么sem掃描電子顯微鏡
參考文檔:www.topgoer.com
使用方法
直接包裝成函數(shù),go關(guān)鍵字觸發(fā)即可
注意事項
1 main方法結(jié)束后,main方法內(nèi)啟動的子協(xié)程會立即結(jié)束,無論是否執(zhí)行完畢;
啟動多個groutine
使用sync包的WaitGroup來控制,等待每一個協(xié)程執(zhí)行完畢:
package mainimport ("fmt""sync""time"
)func printHello(wg *sync.WaitGroup) {time.Sleep(3 * time.Second)defer wg.Done()fmt.Println("__hello__")
}func main() {var wg sync.WaitGroupwg.Add(3)go printHello(&wg)go printHello(&wg)go printHello(&wg)wg.Wait()
}
要知道協(xié)程執(zhí)行順序,以上代碼可以修改為:
package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc printHello(i int) {defer wg.Done()time.Sleep(3 * time.Second)fmt.Printf("__hello:%d__\n", i)
}func main() {for i := 0; i < 10; i++ {wg.Add(1)go printHello(i)}wg.Wait()
}
根據(jù)打印結(jié)果來看,執(zhí)行是無序的。
goroutine與線程
goroutine生命周期開始時的棧默認(rèn)只有2kb,可以按需增大或縮小,最大可到1GB,一次性創(chuàng)造10萬個goroutine也是可以的。
goroutine調(diào)度
GPM是Go語言運(yùn)行時(runtime)層面的實現(xiàn),是go語言自己實現(xiàn)的一套調(diào)度系統(tǒng)。區(qū)別于操作系統(tǒng)調(diào)度OS線程;
G:goroutine
P:processor處理器,管理著一組goroutine隊列,P里面會存儲當(dāng)前goroutine運(yùn)行的上下文環(huán)境(函數(shù)指針,堆棧地址及地址邊界),P會對自己管理的goroutine隊列做一些調(diào)度
M:machine,是Go運(yùn)行時(runtime)對操作系統(tǒng)內(nèi)核線程的虛擬, M與內(nèi)核線程一般是一一映射的關(guān)系, 一個groutine最終是要放到M上執(zhí)行的。
P與M一般也是一一對應(yīng)的。他們關(guān)系是: P管理著一組G掛載在M上運(yùn)行。當(dāng)一個G長久阻塞在一個M上時,runtime會新建一個M,阻塞G所在的P會把其他的G 掛載在新建的M上。當(dāng)舊的G阻塞完成或者認(rèn)為其已經(jīng)死掉時 回收舊的M