golang基礎--Gocurrency併發

来源:https://www.cnblogs.com/failymao/archive/2018/07/19/9333592.html
-Advertisement-
Play Games

goroutine只是由官方實現的超級"線程池"而已,每個實例4 5kb的棧記憶體占用和用於實現機制而大幅減少的創建和銷毀開銷。 併發不是並行(多CPU): 併發主要由切換時間片來實現"同時"運行,並行則是直接利用多核實現多線程的運行,但Go可以設置使用核數,以發揮多核電腦的能力。 通過go關鍵字實 ...


  • goroutine只是由官方實現的超級"線程池"而已,每個實例4-5kb的棧記憶體占用和用於實現機制而大幅減少的創建和銷毀開銷。

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

  • 併發主要由切換時間片來實現"同時"運行,並行則是直接利用多核實現多線程的運行,但Go可以設置使用核數,以發揮多核電腦的能力。
    • 通過go關鍵字實現多線程
    package main
    import (
        "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 main
    import (
        "fmt"
    )
    
    func main() {                 //主程式
        c := make(chan bool)      //初始化一個chan類型
        go func() {               //子程式
            fmt.Println("123...") //執行主程式
            c <- true             //通過<-存入bool類型到chan中
        }()
    fmt.Println(1)                //程式執行步驟:1st
    read_chan := <-c              //<-c 從chan中讀取bool,程式執行步驟:2nd
    fmt.Println(read_chan)       //程式執行步驟:3rd
    }
    
    /*output
    1st     1           
    2nd     123...
    3rd     true
    */

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

    • Channel是引用類型

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

    package main
    import (
        "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 main
    import (
        "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
    }
    
    /*output
    1   2
    2   123...
    2   123 true
    3   3
        */

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 效果如下:點擊發送驗證碼按鈕,按鈕背景變色,不可點擊,顯示倒計時文字 首先js文件的data裡面 聲明一個變數用於表示當前是否可以點擊,codeIsCanClick = true, 預設是可以點擊的 寫下界面代碼: wxml文件中 對應樣式 wxss文件: 以上構成頁面靜態效果。 註意button有 ...
  • 一、關於樣式(CSS) 1、Input 1)Input可編輯可下拉 2)Input下拉 3)Input邊線點擊不顯示 input點擊邊框樣式無效 4)提示文字:placeholder="手機號" input修改提示文字顏色 5)input出現背景是黃色 這種點擊框也不會出現黃色了 還有一種就是關閉自 ...
  • 前言 秒殺架構到後期,我們採用了消息隊列的形式實現搶購邏輯,那麼之前拋出過這樣一個問題:消息隊列非同步處理完每個用戶請求後,如何通知給相應用戶秒殺成功? 場景映射 首先,我們舉一個生活中比較常見的例子:我們去銀行辦理業務,一般會選擇相關業務列印一個排號紙,然後就可以坐在小板凳上玩著手機,等待被小喇叭報 ...
  • fork/join作為一個併發框架在jdk7的時候就加入到了我們的java併發包java.util.concurrent中,並且在java 8 的lambda並行流中充當著底層框架的角色。這樣一個優秀的框架設計,我自己想瞭解一下它的底層代碼是如何實現的,所以我嘗試的去閱讀了JDK相關的源碼。下麵我打 ...
  • 所有的異常都有一個超類throwable; throwable有兩個子類:Exception和error(一般在重大錯誤,不能夠自行恢復); Exception有兩個子類:checked和runtime exception異常; checked:檢查時異常,就是程式代碼有的錯誤會有紅色波浪線的異常, ...
  • Description Mato同學最近正在研究一種矩陣,這種矩陣有n行n列第i行第j列的數為gcd(i,j)。 例如n=5時,矩陣如下: 1 1 1 1 1 1 2 1 2 1 1 1 3 1 1 1 2 1 4 1 1 1 1 1 5 Mato想知道這個矩陣的行列式的值,你能求出來嗎? Mato ...
  • 上次知識回顧:https://www.cnblogs.com/dotnetcrazy/p/9278573.html 代碼褲子:https://github.com/lotapp/BaseCode 線上編程:https://mybinder.org/v2/gh/lotapp/BaseCode/mast ...
  • 引言 上一篇文章聊到了Java記憶體模型,在其中我們說JMM是建立在happens before(先行發生)原則之上的。 為什麼這麼說呢?因為在Java程式的執行過程中,編譯器和處理器對我們所寫的代碼進行了一系列的優化來提高程式的執行效率。這其中就包括對指令的“重排序”。 重排序導致了我們代碼並不會按 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...