探索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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
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
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
本文將帶您探索深圳南澳這個夢幻的旅遊目的地,結合美麗的沙灘、豐富的特色美食與豬八戒表演,讓每一刻都充滿樂趣與放鬆。無論是喜歡水上活動、品味地道美食,還是享受自然美景,南澳都能滿足您的需求。一起計劃您的旅行,感受南澳的獨特魅力! Whatsapp查詢: https://wa.me/85263192
Thumbnail
如何尋找和理解自己的專長,從潛意識中察覺自然而然的行為和情感模式出發,並且強調「擅長的事」並不是毫無缺點的能力,而是每個人獨特平衡的一面。成功的定義也由此而來,應該基於自身的卓越追求,而不僅僅是社會的標準。透過作者的經驗分享和深刻反思,希望能幫助更多讀者找到自己的真實內心和生活目標。
Thumbnail
本文分享了透過自我理解術來釐清人生方向的要素,探討了三大支柱:喜歡的事、擅長的事及重視的事。內容涵蓋如何運用這些概念幫助個人找到真正想做的事情,以及在現代職場中應對迷茫感的策略。讀者能更深入理解自我內心的需求,勇敢追求自己的夢想。
Thumbnail
探討了當代大學畢業生面對的迷茫,以及如何透過理解自身興趣與能力找到職業方向; 文章提供了思考指引,讓每位年輕人能在快速變遷的社會中找到自己的定位
想體驗時尚與奢華的生活方式?香港絕對是您不可錯過的旅遊目的地。這座國際大都會擁有世界頂級的購物中心、豪華酒店、米其林餐廳,以及豐富的文化藝術場所。現在正是暢遊香港的最佳時機,跟著百威旅遊一起探索藝文熱點,並享受奢華購物的無限魅力。 https://www.youtube.com/watch?v
Thumbnail
燒烤肉類是一種廣受歡迎的烹飪方式,它能讓肉質變得香嫩多汁。然而,你知道這種美味的背後涉及到一個有趣的化學過程嗎?在這篇文章中,我們將探索肉類燒烤時蛋白質的變性過程、化學機構以及相關的製作方式和口感變化。
Thumbnail
引言 豆類發酵製品,如豆腐、味噌和醬油,是亞洲美食中不可或缺的一部分。這些傳統的食品不僅提供了獨特的風味和質地,還具有健康益處。讓我們一起探索豆類發酵製品背後的化學反應和製作方法。
Thumbnail
想知道法庭內不同顏色的法袍背後到底代表什麼嗎?這篇文章將帶你揭開法袍的神秘面紗!從明亮的紅色到低調的黑色,每種色彩都有其獨特的象徵意義與職務。這篇文章將告訴你不同顏色法袍的真正身份,讓你對法庭內的角色更有了解!
近年來,環保意識的興起和能源危機的嚴峻形勢,使得綠色能源逐漸成為人們關注的焦點。綠色能源是指那些對環境友好、可再生、且不會對生態造成破壞的能源,例如太陽能、風能、水能等。那麼,綠色能源的發展與挑戰是什麼?未來的能源之路又會如何?
Thumbnail
從畫原生三角圖與現在關係圖的過程中,會讓我們更加了解自己和伴侶、孩子,甚至是朋友、同事之間的關係型態,最重要的是,我們可以改變,可以重新學習,讓我們創造與發展和過去不同的關係,走向自己的幸福之路。