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

利用go語(yǔ)言編寫(xiě)一個(gè)并發(fā)包

 更新時(shí)間:2023年10月22日 08:08:26   作者:nil  
這篇文章主要為大家詳細(xì)介紹了如何利用go語(yǔ)言編寫(xiě)一個(gè)并發(fā)包,適合大部分并發(fā)任務(wù),開(kāi)箱即用,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下

寫(xiě)在前面

這是一個(gè)只需要用50行代碼(核心代碼只有15行)實(shí)現(xiàn)的極其簡(jiǎn)單(原理簡(jiǎn)單、使用方法簡(jiǎn)單、功能簡(jiǎn)單)的go包mini_parallel_job,適合大部分并發(fā)任務(wù),開(kāi)箱即用。

代碼

package mini_parallel_job

import (
    "fmt"
    "sync"
)

type JobType func()

type JobPool interface {
    AddJob(jobType JobType)
    Wait()
}

type jobPool struct {
    jobs []JobType
}

// 添加任務(wù)
func (j *jobPool) AddJob(job JobType) {
    j.jobs = append(j.jobs, job)
}

// 開(kāi)始并且等待任務(wù)
func (j *jobPool) Wait() {
    var wg sync.WaitGroup
    wg.Add(len(j.jobs))
    for i := range j.jobs {
       jJob := j.jobs[i]
       go func() {
          defer func() {
             wg.Done()
             if err := recover(); err != nil {
                fmt.Printf("err:%+v", err)
             }
          }()

          jJob()
       }()
    }
    wg.Wait()
}

func NewJobPool() JobPool {
    return &jobPool{
       jobs: make([]JobType, 0),
    }
}

壓測(cè)

package mini_parallel_job

import (
    "testing"
)

const (
    Count = 10
)

// 并行任務(wù)
func parallelJob() {
    jobPool := NewJobPool()
    for i := 0; i < Count; i++ {
       jobPool.AddJob(func() {
          _ = fib(10)
       })
    }
    jobPool.Wait()
}

// 串行任務(wù)
func serialJob() {
    for i := 0; i < Count; i++ {
       _ = fib(10)
    }
}

// 任務(wù)
func fib(n int) int {
    if n == 0 || n == 1 {
       return n
    }
    return fib(n-2) + fib(n-1)
}

// 性能測(cè)試
func BenchmarkSerialJob(b *testing.B) {
    for i := 0; i < b.N; i++ {
       serialJob()
    }
}

func BenchmarkParallelJob(b *testing.B) {
    for i := 0; i < b.N; i++ {
       parallelJob()
    }
}

/*
BenchmarkSerialJob-12             298855              3756 ns/op
BenchmarkParallelJob-12           117189              8710 ns/op
*/

example

package main

import (
    "fmt"
    mini_parallel_job "mini-parallel-job"
    "time"
)

const (
    JobCount = 10
)

func main() {
    // 串行執(zhí)行
    begin1 := time.Now()
    for i := 0; i < JobCount; i++ {
       fib(40)
    }
    fmt.Println(time.Since(begin1))

    // 并行執(zhí)行
    begin2 := time.Now()
    parallelJob := mini_parallel_job.NewJobPool()
    for i := 0; i < JobCount; i++ {
       parallelJob.AddJob(func() {
          fib(40)
       })
    }
    parallelJob.Wait()
    fmt.Println(time.Since(begin2))

    /*
       結(jié)果:
       7.335989407s
       1.112108503s
    */
}

// 任務(wù)
func fib(n int) int {
    if n == 0 || n == 1 {
       return n
    }
    return fib(n-2) + fib(n-1)
}

總結(jié)

這段代碼僅僅實(shí)現(xiàn)使用go rountine實(shí)現(xiàn)并發(fā),sync.WaitGroup實(shí)現(xiàn)等待。

在大多數(shù)場(chǎng)景中,只需要并發(fā),并不關(guān)心并發(fā)量是多少,大多數(shù)程序員也是使用Wait函數(shù)那段代碼實(shí)現(xiàn)的(至少作者在項(xiàng)目中看到都是這樣的,并且有多處相同的代碼,基于此場(chǎng)景封裝了一下)。

如果要實(shí)現(xiàn)復(fù)雜一點(diǎn)的場(chǎng)景,比如控制最大并發(fā)量,可以稍微對(duì)上述代碼做一些修改,Wait函數(shù)中加一個(gè)指定大小的chan來(lái)控制。或者參考作者另外一個(gè)對(duì)go并發(fā)的封裝gopool,使用master-worker模式實(shí)現(xiàn)的并發(fā)控制。

到此這篇關(guān)于利用go語(yǔ)言編寫(xiě)一個(gè)并發(fā)包的文章就介紹到這了,更多相關(guān)go并發(fā)包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • win10下go mod配置方式

    win10下go mod配置方式

    這篇文章主要介紹了win10下go mod配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Golang程序如何查找內(nèi)存泄漏(pprof)

    Golang程序如何查找內(nèi)存泄漏(pprof)

    該文章詳細(xì)介紹了如何使用Golang的pprof工具查找內(nèi)存泄漏,首先,在main包中引入pprof包并設(shè)置條件編譯,然后編譯程序并運(yùn)行,通過(guò)執(zhí)行g(shù)otoolpprof-inuse_space命令,可以進(jìn)入交互模式并使用top命令查看內(nèi)存分配最多的函數(shù),如果本機(jī)中有源代碼
    2024-12-12
  • Golang中HTTP服務(wù)的分析與設(shè)計(jì)詳解

    Golang中HTTP服務(wù)的分析與設(shè)計(jì)詳解

    這篇文章主要介紹了Golang中HTTP服務(wù)的分析與設(shè)計(jì),HTTP服務(wù)是實(shí)現(xiàn)Web應(yīng)用程序的重要組成部分,為了實(shí)現(xiàn)高效可擴(kuò)展的Web應(yīng)用程序,需要對(duì)HTTP服務(wù)進(jìn)行分析與設(shè)計(jì),需要的朋友可以參考下
    2023-05-05
  • golang遍歷處理map時(shí)的常見(jiàn)性能陷阱與解決方法

    golang遍歷處理map時(shí)的常見(jiàn)性能陷阱與解決方法

    這篇文章主要為大家詳細(xì)介紹了Golang中有關(guān)循環(huán)處理map時(shí)的性能優(yōu)化,本文主要介紹了常見(jiàn)的三種場(chǎng)景,文中的示例代碼講解詳細(xì),需要的可以了解下
    2025-05-05
  • Go實(shí)現(xiàn)快速生成固定長(zhǎng)度的隨機(jī)字符串

    Go實(shí)現(xiàn)快速生成固定長(zhǎng)度的隨機(jī)字符串

    這篇文章主要為大家詳細(xì)介紹了怎樣在Go中簡(jiǎn)單快速地生成固定長(zhǎng)度的隨機(jī)字符串,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以學(xué)習(xí)一下
    2022-10-10
  • 解決golang 反射interface{}做零值判斷的一個(gè)重大坑

    解決golang 反射interface{}做零值判斷的一個(gè)重大坑

    這篇文章主要介紹了解決golang 反射interface{}做零值判斷的一個(gè)重大坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • golang中包無(wú)法引入問(wèn)題解決

    golang中包無(wú)法引入問(wèn)題解決

    本文主要介紹了golang中包無(wú)法引入問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 詳解Go?依賴管理?go?mod?tidy

    詳解Go?依賴管理?go?mod?tidy

    這篇文章主要為大家介紹了詳解Go?依賴管理?go?mod?tidy,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型

    Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型

    這篇文章主要介紹了Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型,根據(jù)Go泛型使用的三步曲提到的:類型參數(shù)化、定義類型約束、類型實(shí)例化我們一步步來(lái)定義我們的緩存結(jié)構(gòu)體,需要的朋友可以參考下
    2022-07-07
  • Go庫(kù)實(shí)現(xiàn)Kafka消息的發(fā)送與接收(docker和k3s安裝kafka)

    Go庫(kù)實(shí)現(xiàn)Kafka消息的發(fā)送與接收(docker和k3s安裝kafka)

    文章介紹使用docker在宿主機(jī)映射容器9092端口部署k3s,并使用Go庫(kù)實(shí)現(xiàn)Kafka消息的發(fā)送與接收,涉及segmentio/kafka-gogo、saramago和sarama等客戶端庫(kù)的應(yīng)用場(chǎng)景
    2025-09-09

最新評(píng)論

化州市| 武乡县| 海原县| 城口县| 石泉县| 尉犁县| 西宁市| 济宁市| 文昌市| 夏津县| 嘉荫县| 凤阳县| 景宁| 定陶县| 万年县| 洛扎县| 嘉兴市| 甘孜县| 乌拉特中旗| 兰坪| 桐庐县| 海阳市| 白水县| 白山市| 连州市| 巴中市| 增城市| 正宁县| 富平县| 连江县| 巢湖市| 龙陵县| 南充市| 清涧县| 洪泽县| 迁西县| 绿春县| 中牟县| 岑溪市| 驻马店市| 东乌珠穆沁旗|