Go 語言并發編程基礎:Goroutine 的創建與調度

Go 語言的并發模型是其最顯著的語言特性之一。Goroutine 是 Go 實現并發的核心機制,它比線程更輕量,調度效率極高。

本章將帶你了解 Goroutine 的基本概念、創建方式以及背后的調度機制。


一、什么是 Goroutine?

Goroutine 是由 Go 運行時(runtime)管理的輕量級線程。

特點:

  • ? 啟動快:創建成本遠小于線程
  • ? 占用小:初始棧大小僅約 2 KB,按需增長
  • ? 數量多:支持成千上萬個 Goroutine 并發運行
  • ? 自動調度:由 Go runtime 自動調度到多個線程上執行

二、創建 Goroutine

創建一個 Goroutine 非常簡單,只需使用?go?關鍵字:

func?sayHello()?{fmt.Println("Hello?from?Goroutine")
}func?main()?{go?sayHello()?//?啟動一個新的?Goroutinefmt.Println("Main?function")time.Sleep(time.Second)?//?等待子協程執行完畢
}

運行效果(輸出可能順序不定):

Main?function
Hello?from?Goroutine

注意:主 Goroutine 退出時,程序將直接終止,其他 Goroutine 即使未完成也會被強制結束。


三、匿名函數啟動 Goroutine

可以使用匿名函數快速創建 Goroutine:

go?func(name?string)?{fmt.Println("Hello,",?name)
}("Go")

四、Goroutine 的調度模型

Go 使用M:N 調度模型

  • ??M(Machine):操作系統線程(OS Thread)
  • ??G(Goroutine):用戶級協程
  • ??P(Processor):邏輯處理器,調度器的核心

調度器作用:

  • ? 把成千上萬個 G 映射到有限的 M 上
  • ? 利用 P 控制并發度(由?GOMAXPROCS?控制)

你可以通過設置?GOMAXPROCS?控制最大并發線程數:

runtime.GOMAXPROCS(2)

默認值為當前機器 CPU 核數。


五、調度器工作方式簡要流程

  1. 1. 創建 Goroutine 后,進入可運行隊列
  2. 2. 調度器從隊列中取出 Goroutine 并分配給線程執行
  3. 3. 阻塞操作(如 IO)會讓線程掛起并調度其他 Goroutine
  4. 4. 非搶占式調度 + 安全點機制(某些點才能切換)

六、調試與觀察 Goroutine

可以使用?runtime?包查看當前 Goroutine 數量:

fmt.Println("Goroutine數量:",?runtime.NumGoroutine())

使用?go tool pprof?或第三方工具(如 delve)分析 Goroutine 狀態。


七、使用場景舉例

  • ? 高并發 Web 服務器處理請求
  • ? 定時任務并發執行
  • ? 異步日志寫入
  • ? 并發爬蟲

八、小結

特性說明
創建方式使用?go?關鍵字
性能數量輕量、棧空間動態增長
調度機制M:N 多對多調度,由 runtime 管理
并發優勢快速、高效、代碼簡潔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84107.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網頁繪制表格

說明&#xff1a; border"1"&#xff1a;設置表格邊框寬度為 1 像素&#xff08;可調整數值改變邊框粗細&#xff09;。cellspacing"0"&#xff1a;設置單元格間距為 0&#xff08;去除邊框間的空白間隙&#xff09;。<thead>&#xff1a;定義表頭區…

Python爬蟲實戰:研究Unirest庫相關技術

一、引言 在當今信息爆炸的時代,網絡數據的獲取與分析變得尤為重要。Python 作為一種功能強大且易于學習的編程語言,在網絡爬蟲領域有著廣泛的應用。Unirest 庫是一個輕量級的 HTTP 客戶端庫,它提供了簡潔的 API,使得發送 HTTP 請求變得更加容易。本論文將詳細分析如何使用…

二、【ESP32開發全棧指南:ESP32 GPIO深度使用】

GPIO&#xff08;通用輸入輸出&#xff09; 是ESP32最基礎卻最核心的功能。本文將帶你深入ESP32的GPIO操作&#xff0c;通過按鍵讀取和LED控制實現物理按鍵→ESP32→LED的完整信號鏈路。 一、ESP32 GPIO核心特性速覽 34個可編程GPIO&#xff08;部分引腳受限&#xff09;輸入模…

調用.net DLL讓CANoe自動識別串口號

1.前言 CANoe9.0用CAPL控制數控電源_canoe讀取程控電源電流值-CSDN博客 之前做CAPL通過串口控制數控電源&#xff0c;存在一個缺點&#xff1a;更換電腦需要改串口號 CSDN上有類似的博客&#xff0c;不過要收費&#xff0c;本文根據VID和PID來自動獲取串口號&#xff0c;代碼…

SpringBoot十二、SpringBoot系列web篇之過濾器Filte詳解

一、前言 JavaWeb三大組件Servlet、Filter、Listener&#xff0c;其中之一便是過濾器Filter。 其實&#xff0c;Filter我們平常用的不多&#xff0c;一般多為項目初期搭建web架構的時候使用&#xff0c;后面用的就少了&#xff0c;在日常業務開發中不太可能碰到需要手寫Filte…

Java實現飛機射擊游戲:從設計到完整源代碼

JAVA打飛機游戲畢業設計 一、游戲概述 本游戲基于Java Swing開發&#xff0c;實現了經典的飛機射擊游戲。玩家控制一架戰斗機在屏幕底部移動&#xff0c;發射子彈擊落敵機&#xff0c;同時躲避敵機攻擊。游戲包含多個關卡&#xff0c;隨著關卡提升&#xff0c;敵機速度和數量…

通俗易懂linux環境變量

如果想要清楚的了解環境變量&#xff0c;我覺得我們需要先大致搞清楚一個簡單的事——什么是會話&#xff1f; 會話大致是什么&#xff1f; 在這里我們的目的是更好的理解環境變量&#xff0c;所以適當講解一下會話即可。通常我們都是用xshell連接遠程服務器&#xff0c;都會打…

【補題】Codeforces Round 715 (Div. 2) C. The Sports Festival

題意&#xff1a;給你一個序列&#xff0c;你可以對它重新排序&#xff0c;然后使每個i&#xff0c;max(a0,a1……ai)-min(a0,a1……ai)最小。問答案是多少 思路&#xff1a; C. The Sports Festival&#xff08;區間DP&#xff09;-CSDN博客 區間dp&#xff0c;完全沒想到…

ubuntu系統文件誤刪(/lib/x86_64-linux-gnu/libc.so.6)修復方案 [成功解決]

報錯信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重啟后報錯信息&…

SIFT算法詳細原理與應用

SIFT算法詳細原理與應用 1 SIFT算法由來 1.1 什么是 SIFT&#xff1f; SIFT&#xff0c;全稱為 Scale-Invariant Feature Transform&#xff08;尺度不變特征變換&#xff09;&#xff0c;是一種用于圖像特征檢測和描述的經典算法。它通過提取圖像中的局部關鍵點&#xff0c;…

NPOI操作EXCEL文件 ——CAD C# 二次開發

缺點:dll.版本容易加載錯誤。CAD加載插件時&#xff0c;沒有加載所有類庫。插件運行過程中用到某個類庫&#xff0c;會從CAD的安裝目錄找&#xff0c;找不到就報錯了。 【方案2】讓CAD在加載過程中把類庫加載到內存 【方案3】是發現缺少了哪個庫&#xff0c;就用插件程序加載進…

Go字符串切片操作詳解:str1[:index]

在Go語言中&#xff0c;return str1[:index] 是一個??字符串切片操作??&#xff0c;它截取字符串的一部分。讓我們深入解析這個操作的含義和原理&#xff1a; 基本語法和含義 str1&#xff1a;原始字符串[:index]&#xff1a;切片操作符str1[:index]&#xff1a; ??起始…

NVIDIA Dynamo:數據中心規模的分布式推理服務框架深度解析

NVIDIA Dynamo&#xff1a;數據中心規模的分布式推理服務框架深度解析 摘要 NVIDIA Dynamo是一個革命性的高吞吐量、低延遲推理框架&#xff0c;專為在多節點分布式環境中服務生成式AI和推理模型而設計。本文將深入分析Dynamo的架構設計、核心特性、代碼實現以及實際應用示例&…

408第一季 - 數據結構 - 棧與隊列的應用

括號匹配 用瞪眼法就可以知道的東西 棧在表達式求值運用 先簡單看看就行&#xff0c;題目做了就理解了 AB是操作符,也是被狠狠加入后綴表達式了&#xff0c;然后后面就是*&#xff0c;只要優先級比棧頂運算符牛逼就放里面&#xff0c;很顯然&#xff0c;*比牛逼 繼續前進&#…

Ubuntu 下開機自動執行命令的方法

Ubuntu 下開機自動執行命令的方法&#xff08;使用 crontab&#xff09; 在日常使用 Ubuntu 或其他 Linux 系統時&#xff0c;我們常常需要讓某些程序或腳本在系統啟動后自動運行。例如&#xff1a;啟動 Clash 代理、初始化服務、定時同步數據等。 本文將介紹一種簡單且常用的…

jpackage 打包 jar包 為exe可執行程序

jpackage --input target/ --main-jar note.jar --runtime-image H:/Dpanbeifeng/apps/finalshell/jre --type app-image --dest output/ --main-class com.textmanager.Main --icon logo2.png --name 貓咪快筆記 jpackage 打包指令詳細介紹 jpackage 概述 jpackage 是…

H5移動端性能優化策略(渲染優化+弱網優化+WebView優化)

一、渲染優化&#xff1a;首屏速度提升的核心?? ??1. 關鍵頁面采用SSR或Native渲染?? ??適用場景??&#xff1a;首頁、列表頁、詳情頁等強內容展示頁面 ??優化原理??&#xff1a; ??SSR&#xff08;服務端渲染&#xff09;??&#xff1a;在服務端生成完整…

Matlab | matlab中的圖像處理詳解

MATLAB 圖像處理詳解 這里寫目錄標題圖像處理 MATLAB 圖像處理詳解一、圖像基礎操作1. 圖像讀寫與顯示2. 圖像信息獲取3. 圖像類型轉換二、圖像增強技術1. 對比度調整2. 去噪處理3. 銳化處理三、圖像變換1. 幾何變換2. 頻域變換四、圖像分割1. 閾值分割2. 邊緣檢測3. 區域分割五…

keysight是德科技N9923A網絡分析儀

keysight是德科技N9923A網絡分析儀 簡  述&#xff1a;N9923A 是一款使用電池供電的便攜式射頻矢量網絡分析儀&#xff0c;其中包括全 2 端口網絡分析儀、電纜和天線測試儀、故障點距離測試儀、功率計以及 1 通道和 2 通道矢量電壓表。 主要特性與技術指標 網絡分析儀 * 2…

idea不識別lombok---實體類報沒有getter方法

介紹 本篇文章&#xff0c;主要講idea引入lombok后&#xff0c;在實體類中加注解Data&#xff0c;在項目啟動的時候&#xff0c;編譯不通過&#xff0c;報錯xxx.java沒有getXxxx&#xff08;&#xff09;方法。 原因有以下幾種 1. idea沒有開啟lombok插件 2. 使用idea-2023…