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

golang的串行處理和并行處理區(qū)別

 更新時間:2021年07月08日 15:23:22   作者:吳楚衡  
golang對比其它語言最大的優(yōu)勢就是并行計算(一個go就能實現(xiàn)并發(fā)),工作中經(jīng)常遇到并發(fā)的場景, 本文主要介紹了golang的串行處理和并行處理,感興趣的可以了解一下

程序運算時往往需要數(shù)據(jù),而數(shù)據(jù)的IO又往往需要時間傳輸,而常見的串行處理,是一個任務(wù)處理完成才接著處理新的任務(wù), 其效率低下可想而知。 假如有3個任務(wù)要處理,而每個任務(wù)都有一定的阻塞,串行處理大概是這個樣子:

main.go

package main

import (
    "fmt"
    "time"
)

type Task struct {
    Duration time.Duration
    Name string
}

func main() {
    // 聲明要處理的任務(wù)
    taskList := []Task {
        {
            1,
            "處理1",
        },
        {
            2,
            "處理2",
        },
        {
            3,
            "處理3",
        },
    }
    starTime := time.Now().Unix()
    for _, item := range taskList {
        goProcess(item)
    }
    fmt.Printf("用時:%ds\n", time.Now().Unix() - starTime)
}

/**
 * 進行處理
 */
func goProcess(task Task) {
    time.Sleep(time.Second * task.Duration) // 假設(shè)這是io阻塞會在這里阻塞一些時間,而這些io可能是網(wǎng)絡(luò)io也可能是磁盤io等,io完成后才會接著運行下去
    fmt.Printf("任務(wù):%s 處理完畢\n", task.Name)
}

處理打印結(jié)果
任務(wù):處理1 處理完畢
任務(wù):處理2 處理完畢
任務(wù):處理3 處理完畢
用時:6s

這種串行處理遇到IO阻塞時,弊端就是太費時間了

可以看到,程序在計算時或許用不到多少時間反而是IO阻塞占用了大量的時間。這種占著茅坑不拉屎,外面等著人直跳腳,確實不太好。而用異步處理則可以跳過阻塞,達到避免占坑的情況發(fā)生。

用協(xié)程的話,則可以在阻塞時先異步執(zhí)行下去而不用等待,等所有協(xié)程都處理結(jié)束,再把處理的結(jié)果匯總起來就可以了,代碼大概是這樣子:

main.go

package main

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

type Task struct {
    Duration time.Duration
    Name string
}

func main() {
    // 聲明要處理的任務(wù)
    taskList := []Task {
        {
            1,
            "處理1",
        },
        {
            2,
            "處理2",
        },
        {
            3,
            "處理3",
        },
    }
    starTime := time.Now().Unix()
    var res []string //處理結(jié)果收集
    resChang := make(chan string, len(taskList))
    wg := &sync.WaitGroup{}
    // 這里收集異步處理的結(jié)果, 通過管道把數(shù)據(jù)傳遞過來,類似于單一訂閱功能吧
    go func() {
        wg.Add(1)
        defer wg.Done() // 通道關(guān)閉后 處理結(jié)果也收集完畢,則觸發(fā) 用于通知下方批處理,處理結(jié)果已經(jīng)收集完畢
        for resItem := range resChang {
            res = append(res, resItem)
        }
    }()
    taskWG := &sync.WaitGroup{}
    for _, item := range taskList {
        taskWG.Add(1) // 批處理 信號量+1
        go goProcess(item, &resChang, taskWG)
    }
    taskWG.Wait()// 這里阻塞,等待所有處理執(zhí)行完畢, 才接著運行下去
    close(resChang)// 已經(jīng)處理完畢后就關(guān)閉處理傳輸通道
    wg.Wait() // 這是阻塞 等待處理收集完畢, 才接著運行去
    // 打印批處理收集的處理結(jié)果
    for _, i := range res {
        fmt.Printf("%s", i)
    }
    fmt.Printf("用時:%ds\n", time.Now().Unix() - starTime)
}

/**
 * 進行處理
 */
func goProcess(task Task, resChan *chan string, taskWG *sync.WaitGroup) {
    time.Sleep(time.Second * task.Duration) // 假設(shè)這是io阻塞會在這里阻塞一些時間,而這些io可能是網(wǎng)絡(luò)io也可能是磁盤io等,才會接著運行下去
    res := fmt.Sprintf("任務(wù):%s 處理完畢\n", task.Name)
    defer func() {
        *resChan <- res // 把處理結(jié)果傳出去
        taskWG.Done() // 批處理信號量-1 來報告處理完畢
    }()
}

運行結(jié)果
任務(wù):處理1 處理完畢
任務(wù):處理2 處理完畢
任務(wù):處理3 處理完畢
用時:3s

相對于之前的串行,這次的并行有效處理IO的阻塞,相當(dāng)于,串行就是占坑不用的角,并行則不管這些,你不用,先把你踹開,給有需要的人用先,這樣一腳腳的踹,效率就上一來了。

到此這篇關(guān)于golang的串行處理和并行處理實現(xiàn)的文章就介紹到這了,更多相關(guān)golang 串行處理和并行處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中對json的優(yōu)雅處理方式

    Golang中對json的優(yōu)雅處理方式

    這篇文章主要給大家介紹了關(guān)于Golang中對json的優(yōu)雅處理方式,解析JSON在golang中很麻煩,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • GoFrame通用類型變量gvar與interface基本使用對比

    GoFrame通用類型變量gvar與interface基本使用對比

    這篇文章主要為大家介紹了GoFrame通用類型變量gvar與interface基本使用對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例

    go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例

    這篇文章主要為大家介紹了go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go語言實現(xiàn)漢諾塔算法

    Go語言實現(xiàn)漢諾塔算法

    之前的文章,我們給大家分享了不少漢諾塔算法的實現(xiàn)語言,包括C、c++、java、python等,今天我們就來使用go語言來實現(xiàn)一下,需要的小伙伴來參考下吧。
    2015-03-03
  • go?micro微服務(wù)proto開發(fā)安裝及使用規(guī)則

    go?micro微服務(wù)proto開發(fā)安裝及使用規(guī)則

    這篇文章主要為大家介紹了go?micro微服務(wù)proto開發(fā)中安裝Protobuf及基本規(guī)范字段的規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Go常問的一些面試題匯總(附答案)

    Go常問的一些面試題匯總(附答案)

    通常我們?nèi)ッ嬖嚳隙〞行┎诲e的Golang的面試題目的,所以總結(jié)下,讓其他Golang開發(fā)者也可以查看到,同時也用來檢測自己的能力和提醒自己的不足之處,這篇文章主要給大家介紹了關(guān)于Go常問的一些面試題以及答案的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • golang的HTTP基本認(rèn)證機制實例詳解

    golang的HTTP基本認(rèn)證機制實例詳解

    這篇文章主要介紹了golang的HTTP基本認(rèn)證機制,結(jié)合實例形式較為詳細(xì)的分析了HTTP請求響應(yīng)的過程及認(rèn)證機制實現(xiàn)技巧,需要的朋友可以參考下
    2016-07-07
  • Golang單元測試中的技巧分享

    Golang單元測試中的技巧分享

    這篇文章主要為大家詳細(xì)介紹了Golang進行單元測試時的一些技巧和科技,文中的示例代碼講解詳細(xì),具有一定的參考價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • 用Go+Redis實現(xiàn)分布式鎖的示例代碼

    用Go+Redis實現(xiàn)分布式鎖的示例代碼

    在分布式的業(yè)務(wù)中 , 如果有的共享資源需要安全的被訪問和處理 , 那就需要分布式鎖,本文主要介紹了用Go+Redis實現(xiàn)分布式鎖的示例代碼,感興趣的可以了解一下
    2021-12-12
  • goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決

    goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決

    這篇文章主要為大家介紹了goland安裝1.7版本報錯Unpacked?SDK?is?corrupted解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11

最新評論

五指山市| 克什克腾旗| 荣成市| 周口市| 东乌| 依兰县| 客服| 盖州市| 二连浩特市| 健康| 泸水县| 曲靖市| 绥滨县| 潞西市| 龙山县| 中宁县| 新津县| 合水县| 黄梅县| 榆树市| 南澳县| 绥化市| 诸城市| 大方县| 平江县| 武隆县| 高平市| 遂川县| 安康市| 东乌| 塔城市| 邓州市| 靖宇县| 山西省| 满洲里市| 寿光市| 莱阳市| 平湖市| 正阳县| 什邡市| 凉山|