golang基礎--Gocurrency並發

來源:互聯網
上載者:User
  • goroutine只是由官方實現的超級"線程池"而已,每個執行個體4-5kb的棧記憶體佔用和用於實現機制而大幅減少的建立和銷毀開銷。

  • 並發不是並行(多CPU): Concurrency Is Not Parallelism

  • 並發主要由切換時間片來實現"同時"運行,並行則是直接利用多核實現多線程的運行,但Go可以設定使用核心數,以發揮多核電腦的能力。
    • 通過go關鍵字實現多線程
    package mainimport (    "fmt"    "time")func Go() {    fmt.Println("1234...") }func main() {    go Go()                //go關鍵字構成多線程    time.Sleep(2 * time.Second) //主程式睡眠2s}
  • Goroutine 奉行通過通訊來共用記憶體,而不是共用記憶體來通訊

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

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

    • Channel是參考型別

    • 可以使用for range來迭代不斷操作channel

    package mainimport (    "fmt")func main() {    c := make(chan bool)      //初始化一個chan類型    go func() {               //go結合匿名函數,構造並發        fmt.Println("123...") //執行主程式        c <- true             //通過<-存入bool類型到chan中        close(c)              //關閉通道:必須明確在哪個地方關閉    }()    for v := range c {       //for迴圈chanel    }}/*output    123...    true*/
    • 可以設定單向(讀&寫)或雙向通道--預設是雙向通道

    • 可以設定緩衝大小(預設為0,阻塞),在未被填充前不會發生阻塞(非同步),比如緩衝20個,可以同時進行20個讀操作或者寫操作,注意讀的操作先於寫的操作

    package mainimport (    "fmt")func main() { //主程式    c := make(chan bool, 1)   //初始化一個chan類型,緩衝為2    go func() {               //子程式        fmt.Println("123...") //執行主程式,執行步驟:2        c <- true             //寫操作,執行步驟:2    }()    fmt.Println(2)            //執行步驟:1    fmt.Println(123, <-c)     //讀操作,執行步驟:2    fmt.Println(3)            //執行步驟:3}/*output1   22   123...2   123 true3   3    */

    設定緩衝後,程式為非同步,讀,寫操作同時完成,當讀取channal中無資料時,也不會造成堵塞,因為與此同時,寫操作也將發生。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.