国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 彩票| 镇安县| 博白县| 潞西市| 绿春县| 德清县| 南岸区| 星座| 宿松县| 宣城市| 白水县| 双江| 绥阳县| 广河县| 堆龙德庆县| 尤溪县| 杭州市| 和田县| 萍乡市| 宜兰县| 柳江县| 宣化县| 同江市| 揭东县| 曲麻莱县| 辽阳县| 兰西县| 保德县| 江都市| 孙吴县| 隆尧县| 石楼县| 克拉玛依市| 民权县| 开化县| 韩城市| 手机| 道真| 兴国县| 泰宁县| 青冈县|