欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用go語言編寫一個并發(fā)包

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

寫在前面

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

代碼

package mini_parallel_job

import (
    "fmt"
    "sync"
)

type JobType func()

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

type jobPool struct {
    jobs []JobType
}

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

// 開始并且等待任務
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),
    }
}

壓測

package mini_parallel_job

import (
    "testing"
)

const (
    Count = 10
)

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

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

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

// 性能測試
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
    */
}

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

總結(jié)

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

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

如果要實現(xiàn)復雜一點的場景,比如控制最大并發(fā)量,可以稍微對上述代碼做一些修改,Wait函數(shù)中加一個指定大小的chan來控制?;蛘邊⒖甲髡吡硗庖粋€對go并發(fā)的封裝gopool,使用master-worker模式實現(xiàn)的并發(fā)控制。

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

相關文章

  • 使用Go?goroutine實現(xiàn)并發(fā)的Clock服務

    使用Go?goroutine實現(xiàn)并發(fā)的Clock服務

    這篇文章主要為大家詳細介紹了如何使用Go?goroutine實現(xiàn)并發(fā)的Clock服務,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06
  • 談談對Golang IO讀寫的困惑

    談談對Golang IO讀寫的困惑

    這篇文章主要介紹了談談對Golang IO讀寫的困惑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • goLand Delve版本太老的問題及解決

    goLand Delve版本太老的問題及解決

    這篇文章主要介紹了goLand Delve版本太老的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 如何使用go實現(xiàn)創(chuàng)建WebSocket服務器

    如何使用go實現(xiàn)創(chuàng)建WebSocket服務器

    文章介紹了如何使用Go語言和gorilla/websocket庫創(chuàng)建一個簡單的WebSocket服務器,并實現(xiàn)商品信息的實時廣播,感興趣的朋友一起看看吧
    2024-11-11
  • Go使用緩存加速外部資源訪問提高性能效率

    Go使用緩存加速外部資源訪問提高性能效率

    緩存是架構設計中的常用概念,本文基于Go實現(xiàn)了一個簡單的緩存組件,支持最基本的緩存操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Go語言文件讀寫操作案例詳解

    Go語言文件讀寫操作案例詳解

    這篇文章主要為大家介紹了Go語言文件讀寫操作案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • GO語言常用的文件讀取方式

    GO語言常用的文件讀取方式

    這篇文章主要介紹了GO語言常用的文件讀取方式,涉及一次性讀取、分塊讀取與逐行讀取等方法,是非常實用的技巧,需要的朋友可以參考下
    2014-12-12
  • GoLang BoltDB數(shù)據(jù)庫詳解

    GoLang BoltDB數(shù)據(jù)庫詳解

    這篇文章主要介紹了GoLang BoltDB數(shù)據(jù)庫,boltdb是使用Go語言編寫的開源的鍵值對數(shù)據(jù)庫,boltdb存儲數(shù)據(jù)時 key和value都要求是字節(jié)數(shù)據(jù),此處需要使用到 序列化和反序列化
    2023-02-02
  • gin通過go build -tags實現(xiàn)json包切換及庫分析

    gin通過go build -tags實現(xiàn)json包切換及庫分析

    這篇文章主要為大家介紹了gin通過go build -tags實現(xiàn)json包切換及庫分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • go語言中fallthrough的用法說明

    go語言中fallthrough的用法說明

    這篇文章主要介紹了go語言中fallthrough的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05

最新評論