搜尋
首頁後端開發Golanggo語言中什麼是WaitGroups?怎麼使用?

go語言中什麼是WaitGroups?怎麼使用?

Mar 17, 2023 pm 08:09 PM
gogolanggo語言waitgroups

什麼是WaitGroups?以下這篇文章就來帶大家了解go語言中WaitGroups,介紹一下使用WaitGroups的方法,希望對大家有幫助!

go語言中什麼是WaitGroups?怎麼使用?

什麼是WaitGroups?

WaitGroups是同步你的goroutines的一種有效方式。想像一下,你和你的家人一起開車旅行。你的父親在一個條形商場或快餐店停下來,買些食物和上廁所。你最好想等大家回來後再開車去地平線。 WaitGroups幫助你做到這一點。

WaitGroups是透過呼叫標準函式庫中的sync套件來定義的。

var wg sync.WaitGroup

那麼,什麼是WaitGroup呢? WaitGroup是一個結構,它包含了程式需要等待多少個goroutine的某些資訊。它是一個包含你需要等待的goroutines數量的群組。

WaitGroups有三個最重要的方法: AddDone和 Wait

  • Add: 加到你需要等待的goroutines的總量上。
  • Done: 從你需要等待的goroutines總數中減去一個。
  • Wait: 阻止程式碼繼續進行,直到沒有更多的goroutines需要等待。

如何使用WaitGroups

讓我們來看看一段程式碼:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(1)

    go func() {
        defer wg.Done()

        fmt.Println(time.Now(), "start")
        time.Sleep(time.Second)
        fmt.Println(time.Now(), "done")
    }()

    wg.Wait()
    fmt.Println(time.Now(), "exiting...")
}
2022-08-21 17:01:54.184744229 +0900 KST m=+0.000021800 start
2022-08-21 17:01:55.184932851 +0900 KST m=+1.000210473 done
2022-08-21 17:01:55.18507731 +0900 KST m=+1.000354912 exiting...
  • 我們先初始化一個WaitGroup wg的實例。
  • 然後我們在wg中加入1,因為我們要等待一個goroutine完成。
  • 然後我們運行這個goroutine。在goroutine內部,我們對wg.Done()進行延遲調用,以確保我們遞減要等待的goroutine的數量。如果我們不這樣做,那麼程式碼將永遠等待goroutine完成,並將導致死鎖。
  • goroutine呼叫之後,我們要確保阻斷程式碼,直到WaitGroup為空。我們透過呼叫wg.Wait()來做到這一點。

為什麼要使用WaitGroups而不是channel?

現在我們知道如何使用WaitGroups,一個自然而然的想法將我們引向這個問題:為什麼使用WaitGroups而不是通道?

根據我的經驗,有幾個原因。

  • WaitGroups往往比較直覺。當你閱讀一段程式碼時,當你看到一個WaitGroup時,你會立即知道程式碼在做什麼。方法的名稱很明確,而且直奔主題。然而,對於通道來說,有時就不是那麼清楚了。使用通道是很聰明的,但當你閱讀一段複雜的程式碼時,理解起來會很麻煩。
  • 有的時候,你不需要使用頻道。例如,讓我們看一下這段程式碼:
 var wg sync.WaitGroup

  for i := 0; i < 5; i++ {
      wg.Add(1)
      go func() {
          defer wg.Done()

          fmt.Println(time.Now(), "start")
          time.Sleep(time.Second)
          fmt.Println(time.Now(), "done")
      }()
  }

  wg.Wait()
  fmt.Println(time.Now(), "exiting...")

你可以看到,這個goroutine並沒有與其他goroutine進行資料交流。如果你的goroutine是一次性的工作,你不需要知道結果,使用WaitGroup是可取的。現在來看看這段程式碼:

  ch := make(chan int)

  for i := 0; i < 5; i++ {
      go func() {
          randomInt := rand.Intn(10)
          ch <- randomInt
      }()
  }

  for i := 0; i < 5; i++ {
      fmt.Println(<-ch)
  }

這裡,goroutine正在向 channel 發送資料。在這些情況下,我們不需要使用WaitGroup,因為這將是多餘的。如果接收已經做了足夠的阻塞,為什麼還要等待goroutine完成?

WaitGroups是專門用來處理等待goroutines的。我覺得通道的主要目的是為了交流數據。你不能用WaitGroup來傳送和接收數據,但你可以用一個channel來同步你的goroutines

最後,沒有正確的答案。我知道這可能很煩人,但這取決於你和你工作的團隊。無論什麼方法都是最好的,沒有答案是錯的。我個人傾向於使用WaitGroups進行同步,但你的情況可能會有所不同。選擇對你來說最直觀的東西。

需要注意的一件事

有時,你可能需要將WaitGroup實例傳遞給goroutine。可能有幾個WaitGroup來處理不同的goroutine,也可能是設計選擇。不管是什麼原因,請確保傳遞指向WaitGroup的指針,像這樣:

var wg sync.WaitGroup

for i := 0; i < 5; i++ {
    wg.Add(1)
    go func(wg *sync.WaitGroup) {
        defer wg.Done()

        fmt.Println(time.Now(), "start")
        time.Sleep(time.Second)
        fmt.Println(time.Now(), "done")
    }(&wg)
}

wg.Wait()
fmt.Println(time.Now(), "exiting...")

原因是Go是一種值傳遞的語言。這意味著每當你向一個函數傳遞一個參數時,Go會複製一個參數並傳遞給它而不是原始物件。在這種情況下發生的是,整個WaitGroup物件將被複製,這意味著goroutine將處理一個完全不同的WaitGroup。 wg.Done()不會從原始的wg中減去,而是減去它的一個副本,這個副本只存在於goroutine

總結

透過使用WaitGroups,我們可以輕鬆同步goroutines,從而確保我們的程式碼在正確的時間執行。儘管通道也可以用於同步,但WaitGroups通常更直觀且更易於閱讀。使用WaitGroup時,請確​​保正確傳遞指向WaitGroup的指針,以防止副本問題出現。無論您選擇哪種方法,都應該選擇最直觀和最適合您和您的團隊的方法。

推薦學習:Golang教學

以上是go語言中什麼是WaitGroups?怎麼使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
GO中的字符串操縱:掌握'字符串”軟件包GO中的字符串操縱:掌握'字符串”軟件包May 14, 2025 am 12:19 AM

掌握Go語言中的strings包可以提高文本處理能力和開發效率。 1)使用Contains函數檢查子字符串,2)用Index函數查找子字符串位置,3)Join函數高效拼接字符串切片,4)Replace函數替換子字符串。注意避免常見錯誤,如未檢查空字符串和大字符串操作性能問題。

去'字符串”包裝提示和技巧去'字符串”包裝提示和技巧May 14, 2025 am 12:18 AM

你應該關心Go語言中的strings包,因為它能簡化字符串操作,使代碼更清晰高效。 1)使用strings.Join高效拼接字符串;2)用strings.Fields按空白符分割字符串;3)通過strings.Index和strings.LastIndex查找子串位置;4)用strings.ReplaceAll進行字符串替換;5)利用strings.Builder進行高效字符串拼接;6)始終驗證輸入以避免意外結果。

GO中的'字符串”軟件包:您的首選字符串操作GO中的'字符串”軟件包:您的首選字符串操作May 14, 2025 am 12:17 AM

thestringspackageingoisesential forefficientstringManipulation.1)itoffersSimpleyetpoperfulfunctionsFortaskSlikeCheckingSslingSubstringsStringStringsStringsandStringsN.2)ithandhishiCodeDewell,withFunctionsLikestrings.fieldsfieldsfieldsfordsforeflikester.fieldsfordsforwhitespace-fieldsforwhitespace-separatedvalues.3)3)

Go Bytes軟件包與字符串軟件包:我應該使用哪個?Go Bytes軟件包與字符串軟件包:我應該使用哪個?May 14, 2025 am 12:12 AM

WhendecidingbetweenGo'sbytespackageandstringspackage,usebytes.Bufferforbinarydataandstrings.Builderforstringoperations.1)Usebytes.Bufferforworkingwithbyteslices,binarydata,appendingdifferentdatatypes,andwritingtoio.Writer.2)Usestrings.Builderforstrin

如何使用'字符串”軟件包逐步操縱字符串如何使用'字符串”軟件包逐步操縱字符串May 13, 2025 am 12:12 AM

Go的strings包提供了多種字符串操作功能。 1)使用strings.Contains檢查子字符串。 2)用strings.Split將字符串分割成子字符串切片。 3)通過strings.Join合併字符串。 4)用strings.TrimSpace或strings.Trim去除字符串首尾的空白或指定字符。 5)用strings.ReplaceAll替換所有指定子字符串。 6)使用strings.HasPrefix或strings.HasSuffix檢查字符串的前綴或後綴。

Go Strings軟件包:如何改進我的代碼?Go Strings軟件包:如何改進我的代碼?May 13, 2025 am 12:10 AM

使用Go語言的strings包可以提升代碼質量。 1)使用strings.Join()優雅地連接字符串數組,避免性能開銷。 2)結合strings.Split()和strings.Contains()處理文本,注意大小寫敏感問題。 3)避免濫用strings.Replace(),考慮使用正則表達式進行大量替換。 4)使用strings.Builder提高頻繁拼接字符串的性能。

GO BYTES軟件包中最有用的功能是什麼?GO BYTES軟件包中最有用的功能是什麼?May 13, 2025 am 12:09 AM

Go的bytes包提供了多種實用的函數來處理字節切片。 1.bytes.Contains用於檢查字節切片是否包含特定序列。 2.bytes.Split用於將字節切片分割成smallerpieces。 3.bytes.Join用於將多個字節切片連接成一個。 4.bytes.TrimSpace用於去除字節切片的前後空白。 5.bytes.Equal用於比較兩個字節切片是否相等。 6.bytes.Index用於查找子切片在largerslice中的起始索引。

使用GO的'編碼/二進制”軟件包掌握二進制數據處理:綜合指南使用GO的'編碼/二進制”軟件包掌握二進制數據處理:綜合指南May 13, 2025 am 12:07 AM

theEncoding/binarypackageingoisesenebecapeitProvidesAstandArdArdArdArdArdArdArdArdAndWriteBinaryData,確保Cross-cross-platformCompatibilitiational and handhandlingdifferentendenness.itoffersfunctionslikeread,寫下,寫,dearte,readuvarint,andwriteuvarint,andWriteuvarIntforPreciseControloverBinary

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中