探索Goroutine:Go語言的併發魔法

閱讀時間約 8 分鐘
raw-image

👨‍💻簡介

在日常生活中,如果能同時做很多事情,效率肯定大大提升,那麼在Go語言中,該如何做到呢,答案就是今天的主角Goroutine了,在Go語言中,讓併發變得簡單的強大工具,今天就是來給他一個快速介紹。

什麼是Goroutine?

首先,讓我們以一個簡單的方式來解釋什麼是Goroutine。Goroutine是Go語言的一個特別的功能,它就像是小型的工作任務,可以讓我們同時處理很多事情,而不需要浪費太多電腦資源。可以把它想像成比傳統方式更聰明的方式來處理多項工作,而不會讓電腦變得超級忙碌。這種功能讓Go語言在處理大量同時執行的工作時變得非常強大。

如何創建和啟動Goroutine

要使用Goroutine很簡單,只需要創建一個函數,然後使用go關鍵字在要使用goroutine的函數前面就完成了。可以看以下範例:

package main

import (
"fmt"
)
func main() {
go sayHello()
// 主程式不會等待Goroutine完成
}
func sayHello() {
fmt.Println("Hello, Goroutine!")
}

在這個例子中,我們使用go關鍵字啟動一個新的Goroutine,Goroutine執行了sayHello函數。但須注意,主程式main不會等待Goroutine完成,所以可能不會看到有印出任何東西來。

可以稍微讓main主程式睡一下,就可以看到輸出了

package main

import (
"fmt"
"time"
)
func main() {
go sayHello()
time.Sleep(1)
}
func sayHello() {
fmt.Println("Hello, Goroutine!")
}

Goroutine的執行過程

下面提供了一個簡單的小程式,在主程式裡有兩個goroutine,試著執行一下程式可以發現輸出是一段一段的,會是0跟1交錯印出,代表兩邊的goroutine會搶著印出,呈現競爭狀態

package main

import (
"fmt"
"time"
)
func main() {
go print1()
go print2()
time.Sleep(time.Second)
}
func print1() {
for i := 0; i < 100; i++ {
fmt.Print("0")
}
}
func print2() {
for i := 0; i < 100; i++ {
fmt.Print("1")
}
}

Goroutine之間的通信

併發往往涉及到多個任務之間的通信。這就是通道(Channel)的用武之地。通道是一種特殊的資料結構,用於在不同的Goroutine之間傳遞資料:

package main

import (
"fmt"
"time"
)
func main() {
ch := make(chan string)
go sendData(ch)
go receiveData(ch)
time.Sleep(2 * time.Second) // 等待Goroutines完成
}
func sendData(ch chan string) {
ch <- "Hello from Goroutine!"
}
func receiveData(ch chan string) {
msg := <-ch
fmt.Println(msg)
}

在這個例子中,我們先創建了一個通道ch,然後使用通道在兩個Goroutine之間傳遞消息。 通道的溝通可以看到範例,<- chan 代表將資料從channel中取出,而chan <- 則代表將資料放進channel

Goroutine同步與等待

通常情況下,我們希望主程式能夠等待所有的Goroutine完成,以確保結果的完整性。這就是WaitGroup的作用:

sync.WaitGroup

這個函數的主要功能是讓主程式等待所有的Goroutine完成,然後再繼續執行接下來的程式,主要有以下幾種方法

  • Add(delta int):用來增加計數器的值,表示有多少個Goroutine需要等待。
  • Done():用來減少計數器的值,表示一個Goroutine已經完成。通常在Goroutine執行完後使用 Done
  • Wait():用來將計數器歸零。當計數器的值為零時,Wait 函數會返回,並允許主程式繼續執行。

接著讓我們來看一下範例:

package main

import (
"fmt"
"sync"
)
func main() {
// 創建一個WaitGroup
var wg sync.WaitGroup
// 啟動5個Goroutine
for i := 0; i < 5; i++ {
wg.Add(1) // 增加計數器
go worker(i, &wg)
}
wg.Wait() // 等待所有Goroutines完成
fmt.Println("All Goroutines have finished.")
}
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 減少計數器
fmt.Printf("Worker %d is done\n", id)
}

可以看到,我們使用WaitGroup來等待所有的Goroutine完成,確保我的主程式可以完整執行而不會提前退出。

Goroutine 的特性與限制

特性

  1. 資源消耗極低:Goroutine 的創建相對輕量,主要消耗少量stack空間。這意味著你可以創建大量的 goroutine 而不必擔心資源耗盡的問題。
  2. 有效的線程管理:當一個 goroutine 被阻塞時,相應的管理線程將被擱置,但運行時會將其他 goroutine 分配給這個線程,使其繼續執行其他工作。這種機制確保了線程的高效使用,避免了資源浪費。
  3. 最大線程數限制:你可以透過設定 $GOMAXPROCS 來限制系統中的線程數量,確保它們不會無節制地增加。這有助於避免系統資源的過度消耗。

限制

  1. Goroutine 數量限制:理論上,Go 語言可以創建極多的 Goroutine,但實際上,系統的可用資源(記憶體和 CPU)是有限的。因此,你需要謹慎控制 Goroutine 的數量,以避免過多的併發造成資源耗盡或性能下降。
  2. 競爭條件和死鎖:Goroutine 的併發操作需要謹慎處理共享資源,否則可能出現競爭條件(race condition)和死鎖(deadlock)。這不是直接的限制,但是在 Goroutine 的設計和使用中需要特別注意,以確保程式的正確性。

小結

相信學習Go語言的各位,也是被Goroutine強大的併發能力所吸引,Goroutine還有許多細節,今天這篇只是簡單介紹Goroutine,之後會再慢慢深入探討Goroutine的奧妙之處。

📚Reference

17會員
83內容數
golang
留言0
查看全部
發表第一個留言支持創作者!
Alan的開發者天地 的其他內容
👨‍💻簡介 當我們在宣告變數時,電腦會為該變數在記憶體中分配一個位置,然後將這個變數值儲存在這個位置上,需要讀取或修改這個變數值時,電腦是透過記憶體位置來存取這個值。 今天來簡單介紹一下go的Pointer,他的特性以及常見用法。
👨‍💻簡介 在軟體開發中,錯誤無所不在。無論是網路請求失敗、檔案不存在,還是數學計算錯誤,處理錯誤是任何開發者的日常工作,系統的穩定度基本取決於對於錯誤處理是否全面,好的錯誤處理也可以產生適當的錯誤訊息,讓 Debug 更加容易。
👨‍💻簡介 當我們在寫程式時,有時候會需要在程式結束時關閉某些資源,而defer這個關鍵字,可以讓你輕鬆的實現,下面來簡單介紹一下defer以及常用的範例。,它為程式設計師提供了一種簡單而強大的工具,用於管理資源和確保程式的正確執行。
👨‍💻簡介 在Go中,假如我要判斷一個資料類型是甚麼,該怎麼做呢? Golang有一個功能叫做Type Assertions(類型斷言),它的作用就是能夠在運行時檢查我的資料類型,讓我在傳遞類型時能確保資料類型是正確的。
👨‍💻簡介 make函數在slice、map和之後會介紹到的channel的初始化中扮演著關鍵的角色。本文將會簡單介紹make函數的用法,以及在初始化不同資料結構時的差異,讓你更好地理解和利用make函數。
👨‍💻簡介 套件(Package)在Golang中扮演著組織和管理程式碼的重要角色。 package就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。
👨‍💻簡介 當我們在宣告變數時,電腦會為該變數在記憶體中分配一個位置,然後將這個變數值儲存在這個位置上,需要讀取或修改這個變數值時,電腦是透過記憶體位置來存取這個值。 今天來簡單介紹一下go的Pointer,他的特性以及常見用法。
👨‍💻簡介 在軟體開發中,錯誤無所不在。無論是網路請求失敗、檔案不存在,還是數學計算錯誤,處理錯誤是任何開發者的日常工作,系統的穩定度基本取決於對於錯誤處理是否全面,好的錯誤處理也可以產生適當的錯誤訊息,讓 Debug 更加容易。
👨‍💻簡介 當我們在寫程式時,有時候會需要在程式結束時關閉某些資源,而defer這個關鍵字,可以讓你輕鬆的實現,下面來簡單介紹一下defer以及常用的範例。,它為程式設計師提供了一種簡單而強大的工具,用於管理資源和確保程式的正確執行。
👨‍💻簡介 在Go中,假如我要判斷一個資料類型是甚麼,該怎麼做呢? Golang有一個功能叫做Type Assertions(類型斷言),它的作用就是能夠在運行時檢查我的資料類型,讓我在傳遞類型時能確保資料類型是正確的。
👨‍💻簡介 make函數在slice、map和之後會介紹到的channel的初始化中扮演著關鍵的角色。本文將會簡單介紹make函數的用法,以及在初始化不同資料結構時的差異,讓你更好地理解和利用make函數。
👨‍💻簡介 套件(Package)在Golang中扮演著組織和管理程式碼的重要角色。 package就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
本文將帶您探索深圳南澳這個夢幻的旅遊目的地,結合美麗的沙灘、豐富的特色美食與豬八戒表演,讓每一刻都充滿樂趣與放鬆。無論是喜歡水上活動、品味地道美食,還是享受自然美景,南澳都能滿足您的需求。一起計劃您的旅行,感受南澳的獨特魅力! Whatsapp查詢: https://wa.me/85263192
Thumbnail
如何尋找和理解自己的專長,從潛意識中察覺自然而然的行為和情感模式出發,並且強調「擅長的事」並不是毫無缺點的能力,而是每個人獨特平衡的一面。成功的定義也由此而來,應該基於自身的卓越追求,而不僅僅是社會的標準。透過作者的經驗分享和深刻反思,希望能幫助更多讀者找到自己的真實內心和生活目標。
Thumbnail
本文分享了透過自我理解術來釐清人生方向的要素,探討了三大支柱:喜歡的事、擅長的事及重視的事。內容涵蓋如何運用這些概念幫助個人找到真正想做的事情,以及在現代職場中應對迷茫感的策略。讀者能更深入理解自我內心的需求,勇敢追求自己的夢想。
Thumbnail
探討了當代大學畢業生面對的迷茫,以及如何透過理解自身興趣與能力找到職業方向; 文章提供了思考指引,讓每位年輕人能在快速變遷的社會中找到自己的定位
想體驗時尚與奢華的生活方式?香港絕對是您不可錯過的旅遊目的地。這座國際大都會擁有世界頂級的購物中心、豪華酒店、米其林餐廳,以及豐富的文化藝術場所。現在正是暢遊香港的最佳時機,跟著百威旅遊一起探索藝文熱點,並享受奢華購物的無限魅力。 https://www.youtube.com/watch?v
Thumbnail
燒烤肉類是一種廣受歡迎的烹飪方式,它能讓肉質變得香嫩多汁。然而,你知道這種美味的背後涉及到一個有趣的化學過程嗎?在這篇文章中,我們將探索肉類燒烤時蛋白質的變性過程、化學機構以及相關的製作方式和口感變化。
Thumbnail
引言 豆類發酵製品,如豆腐、味噌和醬油,是亞洲美食中不可或缺的一部分。這些傳統的食品不僅提供了獨特的風味和質地,還具有健康益處。讓我們一起探索豆類發酵製品背後的化學反應和製作方法。
Thumbnail
想知道法庭內不同顏色的法袍背後到底代表什麼嗎?這篇文章將帶你揭開法袍的神秘面紗!從明亮的紅色到低調的黑色,每種色彩都有其獨特的象徵意義與職務。這篇文章將告訴你不同顏色法袍的真正身份,讓你對法庭內的角色更有了解!
近年來,環保意識的興起和能源危機的嚴峻形勢,使得綠色能源逐漸成為人們關注的焦點。綠色能源是指那些對環境友好、可再生、且不會對生態造成破壞的能源,例如太陽能、風能、水能等。那麼,綠色能源的發展與挑戰是什麼?未來的能源之路又會如何?
Thumbnail
從畫原生三角圖與現在關係圖的過程中,會讓我們更加了解自己和伴侶、孩子,甚至是朋友、同事之間的關係型態,最重要的是,我們可以改變,可以重新學習,讓我們創造與發展和過去不同的關係,走向自己的幸福之路。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
本文將帶您探索深圳南澳這個夢幻的旅遊目的地,結合美麗的沙灘、豐富的特色美食與豬八戒表演,讓每一刻都充滿樂趣與放鬆。無論是喜歡水上活動、品味地道美食,還是享受自然美景,南澳都能滿足您的需求。一起計劃您的旅行,感受南澳的獨特魅力! Whatsapp查詢: https://wa.me/85263192
Thumbnail
如何尋找和理解自己的專長,從潛意識中察覺自然而然的行為和情感模式出發,並且強調「擅長的事」並不是毫無缺點的能力,而是每個人獨特平衡的一面。成功的定義也由此而來,應該基於自身的卓越追求,而不僅僅是社會的標準。透過作者的經驗分享和深刻反思,希望能幫助更多讀者找到自己的真實內心和生活目標。
Thumbnail
本文分享了透過自我理解術來釐清人生方向的要素,探討了三大支柱:喜歡的事、擅長的事及重視的事。內容涵蓋如何運用這些概念幫助個人找到真正想做的事情,以及在現代職場中應對迷茫感的策略。讀者能更深入理解自我內心的需求,勇敢追求自己的夢想。
Thumbnail
探討了當代大學畢業生面對的迷茫,以及如何透過理解自身興趣與能力找到職業方向; 文章提供了思考指引,讓每位年輕人能在快速變遷的社會中找到自己的定位
想體驗時尚與奢華的生活方式?香港絕對是您不可錯過的旅遊目的地。這座國際大都會擁有世界頂級的購物中心、豪華酒店、米其林餐廳,以及豐富的文化藝術場所。現在正是暢遊香港的最佳時機,跟著百威旅遊一起探索藝文熱點,並享受奢華購物的無限魅力。 https://www.youtube.com/watch?v
Thumbnail
燒烤肉類是一種廣受歡迎的烹飪方式,它能讓肉質變得香嫩多汁。然而,你知道這種美味的背後涉及到一個有趣的化學過程嗎?在這篇文章中,我們將探索肉類燒烤時蛋白質的變性過程、化學機構以及相關的製作方式和口感變化。
Thumbnail
引言 豆類發酵製品,如豆腐、味噌和醬油,是亞洲美食中不可或缺的一部分。這些傳統的食品不僅提供了獨特的風味和質地,還具有健康益處。讓我們一起探索豆類發酵製品背後的化學反應和製作方法。
Thumbnail
想知道法庭內不同顏色的法袍背後到底代表什麼嗎?這篇文章將帶你揭開法袍的神秘面紗!從明亮的紅色到低調的黑色,每種色彩都有其獨特的象徵意義與職務。這篇文章將告訴你不同顏色法袍的真正身份,讓你對法庭內的角色更有了解!
近年來,環保意識的興起和能源危機的嚴峻形勢,使得綠色能源逐漸成為人們關注的焦點。綠色能源是指那些對環境友好、可再生、且不會對生態造成破壞的能源,例如太陽能、風能、水能等。那麼,綠色能源的發展與挑戰是什麼?未來的能源之路又會如何?
Thumbnail
從畫原生三角圖與現在關係圖的過程中,會讓我們更加了解自己和伴侶、孩子,甚至是朋友、同事之間的關係型態,最重要的是,我們可以改變,可以重新學習,讓我們創造與發展和過去不同的關係,走向自己的幸福之路。