Go 協程(Goroutine)入門與基礎使用

一、什么是協程(Goroutine)?

簡單來說,協程是由 Go 語言運行時管理的輕量級線程。相比系統線程,它的調度開銷極小,內存占用非常少(默認只需 2KB 棧空間)。

你可以在一個程序中輕松創建成千上萬個 goroutine,而不會像傳統線程那樣造成系統負擔。

二、如何創建一個協程

只需要在函數調用前加上 go?關鍵字,Go 就會在新的協程中異步執行該函數:

package mainimport ("fmt""time"
)func sayHello() {fmt.Println("Hello from goroutine")
}func main() {go sayHello() // 啟動一個新的協程time.Sleep(1 * time.Second) // 給協程執行的時間
}

如果不加 time.Sleep主線程可能直接退出,協程還沒執行完,即不會輸出"Hello from goroutine"。

三、多個協程并發執行

我們可以輕松開啟多個任務同時運行:

package mainimport ("fmt""time"
)func main() {for i := 0; i < 5; i++ {go func(i int) {fmt.Printf("Worker %d is running\n", i)}(i)}time.Sleep(1 * time.Second)
}

輸出順序是不確定的,因為每個協程的調度是由 Go 運行時決定的。

四、協程與主線程的關系

主函數是 Go 程序的入口,也是主協程。一旦 main() 執行完畢,程序就退出,即使其他協程還在執行

為了解決這個問題,我們常用 sync.WaitGroup 等機制來等待所有協程結束:

package mainimport ("fmt""sync"
)var wg sync.WaitGroupfunc worker(id int) {defer wg.Done()fmt.Printf("Worker %d done\n", id)
}func main() {for i := 1; i <= 3; i++ {wg.Add(1)go worker(i)}wg.Wait() // 等待所有 goroutine 完成
}

五、goroutine 的注意事項

閉包中的變量捕獲問題

package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc main() {wg.Add(3)for i := 1; i <= 3; i++ {go func() {time.Sleep(time.Second)fmt.Println(i)wg.Done()}()}wg.Wait() // 等待所有 goroutine 完成
}

正確做法是將變量作為參數傳進去:

package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc main() {wg.Add(3)for i := 1; i <= 3; i++ {go func(val int) {time.Sleep(time.Second)fmt.Println(val)wg.Done()}(i)}wg.Wait() // 等待所有 goroutine 完成
}

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

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

相關文章

matlab 各種智能優化算法

1. 優化算法相關 蟻群優化算法&#xff08;ACO&#xff09; 蟻群優化算法是一種模擬螞蟻覓食行為的優化技術。以下是一個簡化版的ACO用于解決旅行商問題&#xff08;TSP&#xff09;的MATLAB代碼&#xff1a; function [bestRoute, minDist] acoTsp(distMatrix, numAnts, n…

Hilt -> Android 專屬依賴注入(DI)框架

Hilt 是 Google 基于 Dagger 封裝的 Android 專屬依賴注入&#xff08;DI&#xff09;框架&#xff0c;顯著簡化了依賴管理流程&#xff0c;提升代碼可維護性和可測試性。以下是核心要點及使用指南&#xff1a; dagger2: Dagger 2 原理和使用-CSDN博客 Hilt vs Dagger2&…

AISHELL-5 全球首套智能駕艙中文語音交互數據集開源

隨著汽車成為人們日常生活中不可或缺的一部分&#xff0c;而駕駛艙中傳統的觸摸交互方式容易分散駕駛員的注意力&#xff0c;存在安全風險&#xff0c;因此&#xff0c;車內基于語音的交互方式得到重視。與通常家庭或會議場景中的語音識別系統不同&#xff0c;駕駛場景中的系統…

openstack之neutron(一)

NFV基礎 neutron是對二層物理網絡的抽象與管理&#xff0c;實例的網絡功能由連接到vSwitch的端口上的vNIC共同實現&#xff0c;再通過物理服務器的物理網卡訪問外部的物理網絡。 NFV實現 網卡虛擬化&#xff1a;tap、tun、veth&#xff1b; 交換機虛擬化&#xff1a;linuxbri…

【Java】Arrays.sort:TimSort

一&#xff0c;概述 書接前文【Java】Arrays.sort:DualPivotQuicksort-CSDN博客 Arrays.sort對基本數據類型使用了雙軸快速排序&#xff0c;但是對Object[]類型&#xff0c;則使用了TimSort&#xff0c;TimSort是穩定的排序&#xff0c;它整合了插入排序歸并排序&#xff0c;…

一個n8n構建的能和LLM對話的Agent

一個n8n構建的能和LLM對話的Agent 1.OLLAMA1.1.下載和安裝1.2.設置環境變量1.3.重啟ollama1.4.測試1.5.拉取模型2.n8n部署2.1. 鏡像拉取和啟動2.2.注冊和登錄2.3.新建一個工作流3.說在后面的話環境搭建說明: windows(RTX 5090)+VM CENTOS 采用本地化的ollama運行LLM n8n是一…

升級 Ubuntu Linux 內核的幾種不同方法

方法 &#xff11; &#xff0d; 使用 dpkg 升級 Linux 內核&#xff08;手動方式&#xff09; 這個方法可以幫助你從 kernel.ubuntu.com 網站手動下載可用的最新 Linux 內核。如果你打算安裝最新版&#xff08;而不是穩定版或者正式發布版&#xff09;&#xff0c;那這種方法…

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一個位于網站根目錄下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指導網絡爬蟲&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取該網站的內容。這個文件遵循 Robots…

Linux 內核 Slab 分配器核心組件詳解

Slab 分配器是 Linux 內核中用于高效管理內存的機制&#xff0c;其核心目標是通過對象緩存減少內存碎片和分配/釋放開銷。以下詳細解析其核心組件及其協作關系&#xff1a; 一、Slab 系統的核心組件 組件 描述 作用場景 Slab 描述符 每個 Slab 的管理結構&#xff08;如 struc…

Oracle 的AHF (Automatic Health Framework) 工具

Oracle 的AHF (Automatic Health Framework) 工具 Oracle AHF (Automatic Health Framework) 是 Oracle 官方提供的診斷工具集合&#xff0c;用于自動收集、分析和診斷 Oracle 數據庫及集群環境的健康狀態和問題。 一 AHF 核心功能概述 1. 主要組件 TFA (Trace File Analyz…

華為服務器obsutil使用方法

本文不生產技術&#xff0c;只做技術的搬運工&#xff01;&#xff01;&#xff01; 前言 最近在使用華為云服務器進行模型訓練&#xff0c;發現其上傳下載文件都極慢&#xff0c;詢問華為官方人員是否限速&#xff0c;對方推薦使用obsutil作為中轉服務進行下載&#xff0c;在…

【大模型訓練】中短序列attention 和MOE層并行方式(二)

我們考慮一個典型的Transformer模型結構&#xff0c;在多層堆疊中&#xff0c;其中包含Attention層和MoE層&#xff08;FeedForward層被替換為MoE層&#xff09;。在模型最后是LM Head&#xff08;語言模型頭&#xff09;&#xff0c;通常是一個全連接層&#xff0c;將隱層向量…

2025-06-09(批量智能裁剪視頻尺寸并延長視頻時長)

import os import subprocess import random import json # 配置參數 TARGET_WIDTH 500 TARGET_HEIGHT 600 TARGET_DURATION 180 # 目標時長&#xff08;秒&#xff09; OUTPUT_DIR "processed_videos" MIRROR_MODES ["none", "horizontal&quo…

CKA考試知識點分享(9)---gateway api

CKA 版本&#xff1a;1.32 第九套題是涉及gateway api相關。 注意&#xff1a;本文不是題目&#xff0c;只是為了學習相關知識點做的實驗。僅供參考 實驗目的 創建一個gateway api&#xff0c;來實現后端鏡像的外部訪問。 gateway api 通過nginx實現 實驗開始 安裝nginx ga…

Kafka 消息模式實戰:從簡單隊列到流處理(一)

一、Kafka 簡介 ** Kafka 是一種分布式的、基于發布 / 訂閱的消息系統&#xff0c;由 LinkedIn 公司開發&#xff0c;并于 2011 年開源&#xff0c;后來成為 Apache 基金會的頂級項目。它最初的設計目標是處理 LinkedIn 公司的海量數據&#xff0c;如用戶活動跟蹤、消息傳遞和…

Linux中使用yum安裝MYSQL

1、關系型數據庫 MySQL 使用 yum 安裝mysql 1、檢查是否已經安裝 Mysql rpm -qa | grep mysql如果安裝了 就進行卸載 rpm -e mysql-community-libs-5.7.44-1.el7.x86_64 rpm -e mysql57-community-release-el7-11.noarch rpm -e mysql-community-common-5.7.44-1.el7.x86_64…

Linux 文件系統與 I/O 編程核心原理及實踐筆記

文章目錄 一、理解文件1.1 狹義理解1.2 廣義理解1.3 文件操作的歸類認識1.4 系統角度&#xff1a;進程與文件的交互1.5 實踐示例 二、回顧 C 文件接口2.1 hello.c 打開文件2.2 hello.c 寫文件2.3 hello.c 讀文件2.4 輸出信息到顯示器的幾種方法2.5 stdin & stdout & st…

1.9 Express

Express 是一個基于 Node.js 平臺的輕量級、靈活的 Web 應用框架&#xff0c;它為構建 Web 應用和 API 提供了一系列強大的功能。 核心特性 中間件支持&#xff1a;Express 使用中間件&#xff08;middleware&#xff09;函數來處理 HTTP 請求和響應。中間件可以訪問請求對象&…

面壁智能MiniCPM4.0技術架構與應用場景

&#x1f4cb; 目錄 1. 引言&#xff1a;端側智能新時代2. MiniCPM4.0概述3. 核心技術架構 3.1 高效雙頻換擋機制3.2 稀疏注意力機制3.3 系統級優化創新 4. 技術突破與性能表現5. 應用場景深度解析 5.1 智能手機應用5.2 智能家居場景5.3 汽車智能化5.4 其他端側應用 6. 行業影…

RabbitMQ路由核心解密:從Exchange到RoutingKey的深度實踐與避坑指南

&#x1f50d; RabbitMQ路由核心解密&#xff1a;從Exchange到RoutingKey的深度實踐與避坑指南 “消息去哪了&#xff1f;”——這是每位RabbitMQ使用者在調試時最常發出的靈魂拷問。 理解Exchange與RoutingKey的協作機制&#xff0c;正是解開路由謎題的關鍵鑰匙。 一、Exchang…