国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

golang基礎(chǔ)之Gocurrency并發(fā)

2020-04-01 18:55:56
字體:
供稿:網(wǎng)友

goroutine只是由官方實現(xiàn)的超級"線程池"而已,每個實例4-5kb的棧內(nèi)存占用和用于實現(xiàn)機制而大幅減少的創(chuàng)建和銷毀開銷。

并發(fā)不是并行(多CPU):  Concurrency Is Not Parallelism

并發(fā)主要由切換時間片來實現(xiàn)"同時"運行,并行則是直接利用多核實現(xiàn)多線程的運行,但Go可以設(shè)置使用核數(shù),以發(fā)揮多核計算機的能力。

  • 通過go關(guān)鍵字實現(xiàn)多線程
package mainimport (  "fmt"  "time")func Go() {  fmt.Println("1234...") }func main() {  go Go()        //go關(guān)鍵字構(gòu)成多線程  time.Sleep(2 * time.Second) //主程序睡眠2s}

Goroutine 奉行通過 通信來共享內(nèi)存 ,而不是 共享內(nèi)存來通信 。

Channel

  • Channel是goroutine溝通的橋梁,大都是阻塞同步的
  • 通過make創(chuàng)建,close關(guān)閉(當(dāng)程序簡單時,回自動關(guān)閉)
package mainimport (  "fmt")func main() {         //主程序  c := make(chan bool)   //初始化一個chan類型  go func() {        //子程序    fmt.Println("123...") //執(zhí)行主程序    c <- true       //通過<-存入bool類型到chan中  }()fmt.Println(1)        //程序執(zhí)行步驟:1stread_chan := <-c       //<-c 從chan中讀取bool,程序執(zhí)行步驟:2ndfmt.Println(read_chan)    //程序執(zhí)行步驟:3rd}/*output1st   1      2nd   123...3rd   true*/

注意以上程序的執(zhí)行順序(channel無緩存時):先執(zhí)行讀取操作 c<-c ,因為channel中沒有值,所以程序發(fā)生阻塞,此時執(zhí)行chanel 寫操作 ,然后再執(zhí)行讀操作。

  • Channel是引用類型
  • 可以使用 for range 來迭代不斷操作channel
package mainimport (  "fmt")func main() {  c := make(chan bool)   //初始化一個chan類型  go func() {        //go結(jié)合匿名函數(shù),構(gòu)造并發(fā)    fmt.Println("123...") //執(zhí)行主程序    c <- true       //通過<-存入bool類型到chan中    close(c)       //關(guān)閉通道:必須明確在哪個地方關(guān)閉  }()  for v := range c {    //for循環(huán)chanel  }}/*output  123...  true*/
  • 可以設(shè)置單向(讀&寫)或雙向通道--默認(rèn)是雙向通道
  • 可以設(shè)置緩存大小(默認(rèn)為0,阻塞),在未被填充前不會發(fā)生阻塞(異步),比如緩存20個,可以同時進(jìn)行20個讀操作或者寫操作,注意 讀的操作先于寫的操作
package mainimport (  "fmt")func main() { //主程序  c := make(chan bool, 1)  //初始化一個chan類型,緩存為2  go func() {        //子程序    fmt.Println("123...") //執(zhí)行主程序,執(zhí)行步驟:2    c <- true       //寫操作,執(zhí)行步驟:2  }()  fmt.Println(2)      //執(zhí)行步驟:1  fmt.Println(123, <-c)   //讀操作,執(zhí)行步驟:2  fmt.Println(3)      //執(zhí)行步驟:3}/*output1  22  123...2  123 true3  3  */

設(shè)置緩存后,程序為異步,讀,寫操作同時完成,當(dāng)讀取channal中無數(shù)據(jù)時,也不會造成堵塞,因為與此同時,寫操作也將發(fā)生。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 娄烦县| 剑河县| 新乡县| 于都县| 简阳市| 中方县| 万全县| 南阳市| 昌乐县| 察隅县| 高碑店市| 宁国市| 西峡县| 安仁县| 濮阳县| 洪洞县| 天津市| 麦盖提县| 礼泉县| 若尔盖县| 宝丰县| 新余市| 土默特左旗| 延川县| 平阴县| 华容县| 济阳县| 宜阳县| 奇台县| 南平市| 涟源市| 武冈市| 霸州市| 龙游县| 闸北区| 潞城市| 永靖县| 汕尾市| 会昌县| 湄潭县| 繁峙县|