golang線程協程,go線程通信

本文目錄一覽:

golang協程調度模式解密

golang學習筆記

頻繁創建線程會造成不必要的開銷,所以才有了線程池。在線程池中預先保存一定數量的線程,新任務發佈到任務隊列,線程池中的線程不斷地從任務隊列中取出任務並執行,可以有效的減少創建和銷毀帶來的開銷。

過多的線程會導致爭搶cpu資源,且上下文的切換的開銷變大。而工作在用戶態的協程能大大減少上下文切換的開銷。協程調度器把可運行的協程逐個調度到線程中執行,同時即時把阻塞的協程調度出協程,從而有效地避免了線程的頻繁切換,達到了少量線程實現高並發的效果。

多個協程分享操作系統分給線程的時間片,從而達到充分利用CPU的目的,協程調度器決定了則決定了協程運行的順序。每個線程同一時刻只能運行一個協程。

go調度模型包含三個實體:

每個處理器維護者一個協程G的隊列,處理器依次將協程G調度到M中執行。

每個P會周期性地查看全局隊列中是否有G待運行並將其調度到M中執行,全局隊列中的G主要來自系統調用中恢復的G.

如果協程發起系統調用,則整個工作線程M被阻塞,協程隊列中的其他協程都會阻塞。

一般情況下M的個數會略大於P個數,多出來的M將會在G產生系統調用時發揮作用。與線程池類似,Go也提供M池子。當協程G1發起系統掉用時,M1會釋放P,由 M1-P-G1 G2 … 轉變成 M1-G1 , M2會接管P的其他協程 M2-P-G2 G3 G4… 。

冗餘的M可能來源於緩存池,也可能是新建的。

當G1結束系統調用後,根據M1是否獲取到P,進行不用的處理。

多個處理P維護隊列可能不均衡,導致部分處理器非常繁忙,而其餘相對空閑。產生原因是有些協程自身不斷地派生協程。

為此Go調度器提供了工作量竊取策略,當某個處理器P沒有需要調度的協程時,將從其他處理中偷取協程,每次偷取一半。

搶佔式調度,是指避免某個協程長時間執行,而阻礙其他協程被調度的機制。

調度器監控每個協程執行時間,一旦執行時間過長且有其他協程等待,會把協程暫停,轉而調度等待的協程,以達到類似時間片輪轉的效果。比如for循環會一直佔用執行權。

在IO密集型應用,GOMAXPROCS大小設置大一些,獲取性能會更好。

IO密集型會經常發生系統調用,會有一個新的M啟用或創建,但由於Go調度器檢測M到被阻塞有一定延遲。如果P數量多,則P管理協程隊列會變小。

golang web 瀏覽器每請求一次 golang是啟動一個新的線程嗎

是協程,每一個請求都會單獨啟動一個 goroutine,可以理解為輕量級線程

面試問題總結(一)Golang

使用go語言的好處: go語言的設計是務實的, go在針對並發上進行了優化, 並且支持大規模高並發, 又由於單一的碼格式, 相比於其他語言更具有可讀性, 在垃圾回收上比java和Python更有效, 因為他是和程序同時執行的.

1. 進程, 線程, 協程的區別, 協程的優勢

2. 講一下GMP模型(重點)

3. Go的GC, 混合寫屏障(重點)

4. go的Slice和數組的區別, slice的擴容原理(重點)

5. 講一下channel,實現原理(重點)

6. 講一下Go的Map的實現原理, 是否線程安全, 如何實現安全(重點)

7. new 和 make 的區別

8. 說一下內存逃逸

9. 函數傳指針和傳值有什麼區別

10. goroutine之間的通信方式

11. 測試是怎麼做的(單元測試, 壓力測試)

12. 堆和棧的區別

golang channel 是線程安全的么

如果把線程安全定義為允許多個goroutine同時去讀寫,那麼golang 的channel 是線程安全的。不需要在並發讀寫同一個channe時加鎖。

Golang 線程和協程的區別

線程:

多線程是為了解決CPU利用率的問題,線程則是為了減少上下文切換時的開銷,進程和線程在Linux中沒有本質區別,最大的不同就是進程有自己獨立的內存空間,而線程是共享內存空間。

在進程切換時需要轉換內存地址空間,而線程切換沒有這個動作,所以線程切換比進程切換代價要小得多。

協程:

想要簡單,又要性能高,協程就可以達到我們的目的,它是用戶視角的一種抽象,操作系統並沒有這個概念,主要思想是在用戶態實現調度算法,用少量線程完成大量任務的調度。

Goroutine是GO語言實現的協程,其特點是在語言層面就支持,使用起來十分方便,它的核心是MPG調度模型:M即內核線程;P即處理器,用來執行Goroutine,它維護了本地可運行隊列;G即Goroutine,代碼和數據結構;S及調度器,維護M和P的信息。

原創文章,作者:BRVJK,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/330149.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
BRVJK的頭像BRVJK
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相關推薦

  • 運維Python和GO應用實踐指南

    本文將從多個角度詳細闡述運維Python和GO的實際應用,包括監控、管理、自動化、部署、持續集成等方面。 一、監控 運維中的監控是保證系統穩定性的重要手段。Python和GO都有強…

    編程 2025-04-29
  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • go-chassis

    本文將深入探究go-chassis,包括它的基本概念,特性,以及如何使用它構建微服務應用程序。 一、微服務架構及其優勢 微服務架構是一種將應用程序拆分為小型、自治服務的體系結構。每…

    編程 2025-04-29
  • Python線程等待指南

    本文將從多個方面詳細講解Python線程等待的相關知識。 一、等待線程結束 在多線程編程中,經常需要等待線程執行完畢再進行下一步操作。可以使用join()方法實現等待線程執行完畢再…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • Python兩個線程交替打印1到100

    這篇文章的主題是關於Python多線程的應用。我們將會通過實際的代碼,學習如何使用Python兩個線程交替打印1到100。 一、創建線程 在Python中,我們可以使用Thread…

    編程 2025-04-28
  • 使用Go-Redis獲取Redis集群內存使用率

    本文旨在介紹如何使用Go-Redis獲取Redis集群的內存使用率。 一、Go-Redis簡介 Go-Redis是一個用於連接Redis服務器的Golang客戶端。它支持Redis…

    編程 2025-04-28
  • Kong 使用第三方的go插件

    本文將針對Kong使用第三方的go插件進行詳細闡述。首先,我們解答下標題的問題:如何使用第三方的go插件?我們可以通過編寫插件來達到此目的。 一、插件架構介紹 Kong的插件系統采…

    編程 2025-04-28
  • Go中struct的初始化

    本文將從多個方面詳細闡述Go中struct的初始化方式,包括使用字面量初始化、使用new函數初始化以及使用構造函數等。通過本文的介紹,讀者能夠更深入的了解Go中struct的初始化…

    編程 2025-04-28
  • ROS線程發佈消息異常解決方法

    針對ROS線程發佈消息異常問題,我們可以從以下幾個方面進行分析和解決。 一、檢查ROS代碼是否正確 首先,我們需要檢查ROS代碼是否正確。可能會出現的問題包括: 是否正確初始化RO…

    編程 2025-04-28

發表回復

登錄後才能評論