日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

你是否想知道如何應對高并發?Go語言為你提供了答案!

來源: 責編: 時間:2024-01-02 09:31:33 241觀看
導讀并發編程是當前軟件領域中不可忽視的一個關鍵概念。隨著CPU等硬件的不斷發展,我們都渴望讓我們的程序運行速度更快、更快。而Go語言在語言層面天生支持并發,充分利用現代CPU的多核優勢,這也是Go語言能夠廣泛流行的一個重

并發編程是當前軟件領域中不可忽視的一個關鍵概念。隨著CPU等硬件的不斷發展,我們都渴望讓我們的程序運行速度更快、更快。而Go語言在語言層面天生支持并發,充分利用現代CPU的多核優勢,這也是Go語言能夠廣泛流行的一個重要原因。QR928資訊網——每日最新資訊28at.com

在Java中,要支持高并發有幾種方案可供選擇。首先,我們可以通過開啟多部署節點集群來增加高并發處理能力,通過增加機器硬件來實現。其次,我們可以在單節點上開啟多線程來處理請求。然而,即使在單節點內創建線程也是非常耗費資源的。因此,通常情況下我們會使用線程池來管理線程的創建和銷毀。然而,有一個公式你可能會很熟悉,即核心線程數等于CPU核數的一半加一。這意味著我們并不是線程創建得越多,對于我們的Java程序就越好。QR928資訊網——每日最新資訊28at.com

在我們明確了問題的痛點之后,我們可以進一步探究一下Go語言是如何解決這些問題,并且將高并發作為Go語言的一項特色功能。QR928資訊網——每日最新資訊28at.com

goroutine

我們在Java中開啟線程的方式是直接創建一個Thread對象。然而,在Go語言中,如果我們想要實現異步處理,我們可以使用"go"關鍵字來開啟一個goroutine協程。協程的最大優勢在于其輕量級,可以輕松創建上百萬個協程而不會導致系統資源的耗盡,而線程和進程通常最多也不能超過1萬個。舉個例子:QR928資訊網——每日最新資訊28at.com

go f()  // 創建一個新的 goroutine 運行函數f

在Go語言中,我們可以非常簡單地使用關鍵字"go"來開啟一個協程,從而實現異步處理函數f。只需在函數f的調用前面加上"go"關鍵字,就能使得該函數在一個獨立的協程中異步執行。QR928資訊網——每日最新資訊28at.com

不僅可以使用"go"關鍵字來開啟一個協程異步執行具名函數,還可以使用"go"關鍵字來開啟一個協程異步執行匿名函數。QR928資訊網——每日最新資訊28at.com

go func(){  // ...}()

今天我們的重點不在這里,而是要討論為什么Go語言適合處理高并發的情況。我們都知道,操作系統的CPU最小調度單位是線程,然而Go語言卻使用了協程的概念。那么問題來了,Go語言是如何將這些協程交給CPU來處理的呢?如果無法將它們交給CPU處理,那么就算再創建多少協程也無法運行代碼。在這里,我們就需要了解一下Go語言的調度器,也就是GPM調度模型。QR928資訊網——每日最新資訊28at.com

GPM調度模型

可以借鑒一下以下圖例,總的來說,我們可以像線程池一樣,無論創建了多少協程,都需要將它們放入隊列中。然后,剩下的任務就交給調度器來處理。QR928資訊網——每日最新資訊28at.com

圖片圖片QR928資訊網——每日最新資訊28at.com

其中:QR928資訊網——每日最新資訊28at.com

  • G:使用關鍵字"go"加上一個函數調用可以創建一個goroutine(簡稱G)。每次調用"go f()"都會創建一個新的G,其中包含要執行的函數f以及相關的上下文信息。
  • 全局隊列(Global Queue)是用來存放等待運行的 G(Goroutine)的地方。
  • P 是指 goroutine 執行所需的物理資源,每個 P 最多可以承載 GOMAXPROCS 個 goroutine 的執行。
  • P 的本地隊列是類似于全局隊列的,它存放了等待運行的G,并且數量限制在256個以內。每當新建一個G時,優先將其加入到P的本地隊列中,如果本地隊列已滿,則會批量移動部分G到全局隊列中。
  • 為了使線程能夠執行任務,需要通過獲取調度器(P)來獲取任務(G)。線程首先嘗試從調度器的本地隊列獲取任務,如果本地隊列為空,則線程會嘗試從全局隊列或其他調度器的本地隊列獲取任務。一旦線程獲取到任務,就會執行任務,并在任務執行完畢后再次從調度器獲取下一個任務,持續重復這個過程。

Goroutine 調度器和操作系統調度器通過 M 結合起來,形成了調度的基本單位。在這個結合中,每個 M 代表一個內核線程,而操作系統調度器則負責將這些內核線程分配到 CPU 的核心上進行執行。QR928資訊網——每日最新資訊28at.com

channel

單純地將函數并發執行是沒有意義的,因為函數與函數之間需要進行數據交換,才能真正體現并發執行函數的意義。QR928資訊網——每日最新資訊28at.com

雖然可以利用共享內存進行數據交換,但是在不同的 goroutine 中使用共享內存容易導致競態問題的出現。為了確保數據交換的正確性,許多并發模型都需要通過使用互斥量對內存進行加鎖來解決這個問題。然而,這種做法往往會帶來性能問題,因為加鎖操作會引入額外的開銷。QR928資訊網——每日最新資訊28at.com

Go語言采用的并發模型是CSP(Communicating Sequential Processes),這個模型強調了通過通信共享內存的方式來實現并發,而不是通過共享內存來實現通信。這種設計理念使得Go語言在處理并發任務時更加高效和安全。QR928資訊網——每日最新資訊28at.com

如果說 goroutine 是Go程序中實現并發執行的主體,那么channel就是連接這些goroutine之間的紐帶。channel是一種能夠使得一個goroutine向另一個goroutine發送特定值的通信機制。QR928資訊網——每日最新資訊28at.com

Mutex(互斥鎖)在實現上也是使用了重量級鎖。與Java的互斥鎖相比,Go語言的Mutex有以下幾點區別:QR928資訊網——每日最新資訊28at.com

內存開銷:Go語言的Mutex相對較輕量,使用較少的內存。這是因為Go語言的Mutex只包含一個字段,用于表示鎖的狀態,而Java的互斥鎖通常包含更多的字段和數據結構。QR928資訊網——每日最新資訊28at.com

鎖的語法:在Go語言中,可以使用mutex.Lock()和mutex.Unlock()方法來手動控制鎖的獲取和釋放,這樣可以更靈活地控制鎖的粒度。而在Java中,使用synchronized關鍵字來實現互斥鎖,鎖的粒度相對固定,只能對整個方法或代碼塊進行加鎖。QR928資訊網——每日最新資訊28at.com

鎖的性能:由于Go語言的Mutex較為輕量,并且采用了更高效的實現方式,比如以下幾個方面:QR928資訊網——每日最新資訊28at.com

  • 自旋鎖:在低并發的情況下,Go語言的Mutex會采用自旋鎖的方式。自旋鎖是一種忙等待的鎖,當一個Goroutine嘗試獲取鎖時,如果鎖已經被其他Goroutine持有,則該Goroutine會一直循環檢查鎖的狀態,直到成功獲取鎖。這種方式避免了線程切換的開銷,提高了性能。
  • 優化的調度策略:Go語言的調度器在處理Goroutine的調度時會進行優化,盡量將鎖的持有者與等待者調度到同一個處理器(P)上執行,減少線程之間的上下文切換和鎖競爭的開銷。
  • 等待隊列:當一個Goroutine無法獲取到Mutex鎖時,它會進入等待隊列,等待鎖的釋放。Go語言的Mutex的等待隊列是基于鏈表實現的,相比Java的互斥鎖使用的等待隊列,具有更低的內存開銷和更高的效率。

總結

并發編程是當前軟件領域中一個重要的概念。Go語言通過goroutine和channel的特性,天生支持高并發處理,充分利用現代CPU的多核優勢。與Java相比,Go語言的協程更加輕量級,可以輕松創建上百萬個協程。Go語言的調度器采用GPM調度模型,通過將協程放入隊列中,由調度器分配給CPU處理。此外,Go語言采用CSP模型,通過channel實現協程之間的通信,避免了共享內存帶來的競態問題。相比之下,Go語言的Mutex鎖更輕量、靈活,并且具有更高的性能。總的來說,Go語言適合處理高并發的情況,成為了當前軟件開發領域的熱門語言之一。QR928資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-55254-0.html你是否想知道如何應對高并發?Go語言為你提供了答案!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 我們一起聊聊K8s定時備份MySQL并發送到指定郵箱

下一篇: 你是否想知道如何應對高并發?Go語言為你提供了答案!

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 小米MIX Fold 3配置細節曝光:搭載領先版驍龍8 Gen2+罕見5倍長焦

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • iQOO 11S新品發布會

    iQOO將在7月4日19:00舉行新品發布會,推出杭州亞運會電競賽事官方用機iQOO 11S。
  • iQOO Neo8系列今日官宣:首發天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯發科新一代旗艦芯片天璣9200+的發布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發搭載這款當前性能最強大的移動平臺
  • 機構稱Q2全球智能手機出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據外媒報道,研究機構的報告顯示,由于需求下滑,今年二季度全球智能手機的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報 記者 王春   □ 本報通訊員 胡佳麗  2020年初,還在上大學的小東加入了一個大學生兼職QQ群。群主“七王”在群里介紹一些刷單賺
Top 主站蜘蛛池模板: 汨罗市| 福贡县| 阆中市| 淳安县| 海盐县| 隆尧县| 灌南县| 大兴区| 阳西县| 惠安县| 安平县| 榕江县| 抚松县| 海丰县| 康保县| 横峰县| 密山市| 祥云县| 怀柔区| 慈溪市| 宁国市| 巴东县| 建始县| 茶陵县| 洛扎县| 汉源县| 当雄县| 水城县| 澄城县| 乐山市| 临邑县| 建湖县| 苏尼特右旗| 丹棱县| 石台县| 铜川市| 吴江市| 合作市| 邹平县| 尼木县| 穆棱市|