久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

怎么在golang中利用并發(fā)實現(xiàn)協(xié)程同步

怎么在golang中利用并發(fā)實現(xiàn)協(xié)程同步?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

站在用戶的角度思考問題,與客戶深入溝通,找到洛南網(wǎng)站設(shè)計與洛南網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬主機、企業(yè)郵箱。業(yè)務(wù)覆蓋洛南地區(qū)。

Java 中有一系列的線程同步的方法,go 里面有 goroutine(協(xié)程),先看下下面的代碼執(zhí)行的結(jié)果是什么呢?

 package main
 import (
   "fmt"
)
 func main() {
  go func() {
    fmt.Println("Goroutine 1")
  }()
  go func() {
    fmt.Println("Goroutine 2")
  }()
}

執(zhí)行以上代碼很可能看不到輸出。

因為有可能這兩個協(xié)程還沒得到執(zhí)行,主協(xié)程就已經(jīng)結(jié)束了,而主協(xié)程結(jié)束時會結(jié)束所有其他協(xié)程,所以導(dǎo)致代碼運行的結(jié)果什么都沒有。

估計不少新接觸 go 的童鞋都會對此郁悶?,可能會問那么該如何等待主協(xié)程中創(chuàng)建的協(xié)程執(zhí)行完畢之后再結(jié)束主協(xié)程呢?

下面說幾種可以解決的方法:

Sleep 一段時間

在 main 方法退出之前 sleep 一段時間就可能會出現(xiàn)結(jié)果了,如下代碼:

 package main
 import (
   "fmt"
  "time"
 )
 func main() {
   go func() {
    fmt.Println("Goroutine 1")
  }()
  go func() {
    fmt.Println("Goroutine 2")
  }()
  time.Sleep(time.Second * 1) // 睡眠1秒,等待上面兩個協(xié)程結(jié)束
}

這兩個簡單的協(xié)程執(zhí)行消耗的時間很短的,所以你會發(fā)現(xiàn)現(xiàn)在就有結(jié)果出現(xiàn)了。

Goroutine 1
Goroutine 2

為什么上面我要說 “可能會出現(xiàn)” ?

因為 sleep 這個時間目前是設(shè)置的 1s,如果我這兩個協(xié)程里面執(zhí)行了很復(fù)雜的邏輯操作(時間大于 1s),那么就會發(fā)現(xiàn)依舊也是無結(jié)果打印出來的。

那么就可以發(fā)現(xiàn)這種方式得到問題所在了:我們無法確定需要睡眠多久

上面那種方式有問題,go 里面其實也可以用管道來實現(xiàn)同步的。

管道實現(xiàn)同步

那么用管道怎么實現(xiàn)同步呢?show code:

 package main
 import (
   "fmt"
 )
 func main() {
   ch := make(chan struct{})
  count := 2 // count 表示活動的協(xié)程個數(shù)
  go func() {
    fmt.Println("Goroutine 1")
    ch <- struct{}{} // 協(xié)程結(jié)束,發(fā)出信號
  }()
  go func() {
    fmt.Println("Goroutine 2")
    ch <- struct{}{} // 協(xié)程結(jié)束,發(fā)出信號
  }()
  for range ch {
    // 每次從ch中接收數(shù)據(jù),表明一個活動的協(xié)程結(jié)束
    count--
    // 當所有活動的協(xié)程都結(jié)束時,關(guān)閉管道
    if count == 0 {
      close(ch)
    }
  }
}

這種方式是一種比較完美的解決方案, goroutine / channel 它們也是在 go 里面經(jīng)常搭配在一起的一對。

sync.WaitGroup

其實 go 里面也提供了更簡單的方式 —— 使用 sync.WaitGroup。

WaitGroup 顧名思義,就是用來等待一組操作完成的。WaitGroup 內(nèi)部實現(xiàn)了一個計數(shù)器,用來記錄未完成的操作個數(shù),它提供了三個方法:

  • Add() 用來添加計數(shù)

  • Done() 用來在操作結(jié)束時調(diào)用,使計數(shù)減一

  • Wait() 用來等待所有的操作結(jié)束,即計數(shù)變?yōu)?0,該函數(shù)會在計數(shù)不為 0 時等待,在計數(shù)為 0 時立即返回

繼續(xù) show code:

package main
 import (
   "fmt"
  "sync"
 )
 func main() {
  var wg sync.WaitGroup
  wg.Add(2) // 因為有兩個動作,所以增加2個計數(shù)
  go func() {
    fmt.Println("Goroutine 1")
    wg.Done() // 操作完成,減少一個計數(shù)
  }()
  go func() {
    fmt.Println("Goroutine 2")
    wg.Done() // 操作完成,減少一個計數(shù)
  }()
  wg.Wait() // 等待,直到計數(shù)為0
}

golang適合做什么

golang可以做服務(wù)器端開發(fā),但golang很適合做日志處理、數(shù)據(jù)打包、虛擬機處理、數(shù)據(jù)庫代理等工作。在網(wǎng)絡(luò)編程方面,它還廣泛應(yīng)用于web應(yīng)用、API應(yīng)用等領(lǐng)域。

關(guān)于怎么在golang中利用并發(fā)實現(xiàn)協(xié)程同步問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

分享標題:怎么在golang中利用并發(fā)實現(xiàn)協(xié)程同步
分享網(wǎng)址:http://sd-ha.com/article22/iedhjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、服務(wù)器托管、網(wǎng)站收錄、外貿(mào)建站Google、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司