最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go 并發(fā)實現(xiàn)協(xié)程同步的多種解決方法

 更新時間:2018年08月31日 09:46:11   投稿:mrr  
這篇文章主要介紹了Go 并發(fā)——實現(xiàn)協(xié)程同步的多種解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

go 簡潔的并發(fā)

多核處理器越來越普及。有沒有一種簡單的辦法,能夠讓我們寫的軟件釋放多核的威力?是有的。隨著Golang, Erlang, Scala等為并發(fā)設(shè)計的程序語言的興起,新的并發(fā)模式逐漸清晰。正如過程式編程和面向?qū)ο笠粯樱粋€好的編程模式有一個極其簡潔的內(nèi)核,還有在此之上豐富的外延??梢越鉀Q現(xiàn)實世界中各種各樣的問題。本文以GO語言為例,解釋其中內(nèi)核、外延。

前言

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--
    // 當(dāng)所有活動的協(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
}

你會發(fā)現(xiàn)也是可以看到運行結(jié)果的,是不是發(fā)現(xiàn)這種方式是很簡單的。

總結(jié)

以上所述是小編給大家介紹的Go 并發(fā)實現(xiàn)協(xié)程同步的多種解決方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • go語言map字典刪除操作的方法

    go語言map字典刪除操作的方法

    這篇文章主要介紹了go語言map字典刪除操作的方法,實例分析了map字典操作的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go語言開發(fā)快速學(xué)習(xí)CGO編程

    Go語言開發(fā)快速學(xué)習(xí)CGO編程

    這篇文章主要為大家介紹了Go語言開發(fā)之快速學(xué)習(xí)CGO編程,看了本文你就會發(fā)現(xiàn)CGO編程其實沒有想象的那么難,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 淺談Go語言的error類型

    淺談Go語言的error類型

    這篇文章主要介紹了淺談Go語言的error類型,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 淺談Golang是如何讀取文件內(nèi)容的(7種)

    淺談Golang是如何讀取文件內(nèi)容的(7種)

    這篇文章主要介紹了淺談Golang是如何讀取文件內(nèi)容的,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • go grpc高級用法

    go grpc高級用法

    RPC是遠程過程調(diào)用,可以像調(diào)用本地服務(wù)一樣取調(diào)用遠程服務(wù),本文主要介紹了go grpc高級用法,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • go語言LeetCode題解1030距離順序排列矩陣單元格

    go語言LeetCode題解1030距離順序排列矩陣單元格

    這篇文章主要為大家介紹了go語言LeetCode題解1030距離順序排列矩陣單元格,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 使用Go添加HTTPS的實現(xiàn)代碼示例

    使用Go添加HTTPS的實現(xiàn)代碼示例

    這篇文章主要介紹了使用Go添加HTTPS的實現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • golang struct擴展函數(shù)參數(shù)命名警告解決方法

    golang struct擴展函數(shù)參數(shù)命名警告解決方法

    今天在使用VSCode編寫golang代碼時,定義一個struct,擴展幾個方法,需要的朋友可以參考下
    2017-02-02
  • golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門

    golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門

    這篇文章主要為大家介紹了golang通用的grpc?http基礎(chǔ)開發(fā)框架使用快速入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • go語言執(zhí)行等待直到后臺goroutine執(zhí)行完成實例分析

    go語言執(zhí)行等待直到后臺goroutine執(zhí)行完成實例分析

    這篇文章主要介紹了go語言執(zhí)行等待直到后臺goroutine執(zhí)行完成的方法,實例分析了Go語言中WaitGroup的使用技巧,需要的朋友可以參考下
    2015-03-03

最新評論

同江市| 屏东市| 五大连池市| 石狮市| 临桂县| 达州市| 边坝县| 迁西县| 台北县| 通榆县| 武安市| 渝北区| 惠东县| 中山市| 辰溪县| 通辽市| 弥渡县| 淳安县| 安西县| 罗甸县| 南和县| 陆川县| 英德市| 玉门市| 潞城市| 东至县| 习水县| 襄垣县| 武城县| 雷波县| 铜川市| 新源县| 文成县| 安丘市| 松滋市| 蓬溪县| 丁青县| 故城县| 卓资县| 浑源县| 富平县|