日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

sync.WaitGroup和sync.Once的愛恨情仇

來源: 責編: 時間:2024-06-05 17:38:10 154觀看
導讀今天,我們將繼續探討Go語言中的兩個重要的同步工具:sync.WaitGroup 和 sync.Once。sync.WaitGroupsync.WaitGroup 是Go語言中的一種計數信號量,用于等待一組 goroutine 完成。它常用于等待一組并發任務全部完成后再繼續

今天,我們將繼續探討Go語言中的兩個重要的同步工具:sync.WaitGroup 和 sync.Once。fWv28資訊網——每日最新資訊28at.com

sync.WaitGroup

sync.WaitGroup 是Go語言中的一種計數信號量,用于等待一組 goroutine 完成。它常用于等待一組并發任務全部完成后再繼續執行。fWv28資訊網——每日最新資訊28at.com

使用方法

  1. 聲明一個 sync.WaitGroup 類型的變量。
  2. 在每個 goroutine 啟動之前調用 Add 方法,增加等待計數。
  3. 在每個 goroutine 完成時調用 Done 方法,減少等待計數。
  4. 在主 goroutine 中調用 Wait 方法,阻塞直到所有 goroutine 完成。

示例代碼

package mainimport (   "fmt"   "sync"   "time")func worker(id int, wg *sync.WaitGroup) {   defer wg.Done()   fmt.Printf("Worker %d starting/n", id)   time.Sleep(time.Second)   fmt.Printf("Worker %d done/n", id)}func main() {   var wg sync.WaitGroup   for i := 1; i <= 5; i++ {       wg.Add(1)       go worker(i, &wg)  }   wg.Wait()   fmt.Println("All workers done")}

在這個例子中,main 函數啟動了5個 goroutine,每個 goroutine 都會運行 worker 函數。每個 worker 在完成時調用 wg.Done(),而 main 函數會等待所有 worker 完成后再繼續執行。fWv28資訊網——每日最新資訊28at.com

注意事項

  • WaitGroup 的計數器不能設為負數,否則會引發 panic。
  • 必須確保在所有 Done 調用之前已經調用了 Add。

sync.Once

sync.Once 是一個用于確保某些操作只執行一次的結構體。它提供了一種線程安全的方式來執行一次性初始化操作。fWv28資訊網——每日最新資訊28at.com

使用方法

  1. 聲明一個 sync.Once 類型的變量。
  2. 使用 Do 方法執行需要僅執行一次的操作。

示例代碼

package mainimport (   "fmt"   "sync")func initialize() {   fmt.Println("Initializing...")}func main() {   var once sync.Once   for i := 0; i < 10; i++ {       go func(i int) {           once.Do(initialize)           fmt.Printf("Goroutine %d/n", i)      }(i)  }   // 等待所有 goroutine 完成   var wg sync.WaitGroup   wg.Add(10)   for i := 0; i < 10; i++ {       go func() {           defer wg.Done()           once.Do(initialize)      }()  }   wg.Wait()}

在這個例子中,initialize 函數只會被執行一次,盡管有多個 goroutine 嘗試調用 once.Do(initialize)。fWv28資訊網——每日最新資訊28at.com

注意事項

  • sync.Once 的 Do 方法接受一個無參函數。
  • 即使 Do 方法被多次調用,傳入的函數也只會執行一次。

結合使用示例

我們可以結合 sync.WaitGroup 和 sync.Once,來完成一個更復雜的并發任務。假設我們有一個初始化操作,只需執行一次,但在多個 goroutine 中執行其他任務。fWv28資訊網——每日最新資訊28at.com

示例代碼

package mainimport (   "fmt"   "sync"   "time")var (   once sync.Once   wg   sync.WaitGroup)func initialize() {   fmt.Println("Initializing...")   time.Sleep(2 * time.Second) // 模擬初始化耗時   fmt.Println("Initialization complete")}func worker(id int) {   defer wg.Done()   once.Do(initialize)   fmt.Printf("Worker %d starting/n", id)   time.Sleep(time.Second) // 模擬工作   fmt.Printf("Worker %d done/n", id)}func main() {   const numWorkers = 5   wg.Add(numWorkers)   for i := 1; i <= numWorkers; i++ {       go worker(i)  }   wg.Wait()   fmt.Println("All workers done")}

在這個例子中,initialize 函數只會執行一次,而 worker 函數會并發執行,等待所有 worker 完成后,程序才會繼續執行。fWv28資訊網——每日最新資訊28at.com

總結

通過本文,我們了解了Go語言中的兩個重要同步工具:sync.WaitGroup 和 sync.Once。sync.WaitGroup 用于等待一組 goroutine 完成,而 sync.Once 則確保某些操作只執行一次。這兩個工具在實際開發中非常實用,能有效地幫助我們處理并發任務。fWv28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-92102-0.htmlsync.WaitGroup和sync.Once的愛恨情仇

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 九大微服務監控工具詳解

下一篇: 別背八股文了,WebSocket 是什么,我勸你花幾分鐘讓面試官驚艷!

標簽:
  • 熱門焦點
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發布,本次就這款耳機新品給大家帶來一個簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內容電商的概念興起,抖音、快手、小紅書組成的&ldquo;新電商三兄弟&rdquo;成為業內一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • iQOO 11S屏幕細節公布:首發三星2K E6全感屏 安卓最好的直屏手機

    日前iQOO手機官方宣布,新一代電競旗艦iQOO 11S將會在7月4日19:00正式與大家見面。隨著發布時間的日益臨近,官方關于該機的預熱也更加密集,截至目前已
  • 榮耀Magicbook V 14 2021曙光藍版本正式開售,擁有觸摸屏

    榮耀 Magicbook V 14 2021 曙光藍版本正式開售,搭載 i7-11390H 處理器與 MX450 顯卡,配備 16GB 內存與 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 鍵盤鍵程、
  • 蘋果140W USB-C充電器:采用氮化鎵技術

    據10 月 30 日 9to5 Mac 消息報道,當蘋果推出新的 MacBook Pro 2021 時,該公司還推出了新的 140W USB-C 充電器,附贈在 MacBook Pro 16 英寸機型的盒子里,也支
Top 主站蜘蛛池模板: 特克斯县| 合江县| 正宁县| 湘潭市| 杭州市| 资中县| 永年县| 淳安县| 班玛县| 章丘市| 乡宁县| 普安县| 耒阳市| 沙雅县| 黄冈市| 德州市| 平谷区| 德安县| 剑川县| 车险| 商城县| 彩票| 呼图壁县| 八宿县| 格尔木市| 康乐县| 吉首市| 宜都市| 广丰县| 漳州市| 东平县| 京山县| 博野县| 延庆县| 临沭县| 天祝| 三亚市| 信丰县| 额尔古纳市| 大港区| 文山县|