涛子 - 简单就是美

成单纯魁增,永继振国兴,克复宗清政,广开家必升

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

https://blog.csdn.net/qq_55752792/article/details/125917846

package main

import (
    "fmt"
    "math/rand"
    "sync"
    "time"
)

// Job struct
type Job struct {
    ID      int64
    RandNum int64
}

// Result struct
type Result struct {
    job   Job
    Total int64
}

var jobChan = make(chan Job, 10)
var resultChan = make(chan Result, 10)

// worker
func worker(wg *sync.WaitGroup) {
    for job := range jobChan {
        total := int64(0)
        randNum := job.RandNum
        for randNum != 0 {
            total += randNum % 10
            randNum /= 10
        }

        time.Sleep(1 * time.Second)

        resultChan <- Result{job, total}
    }

    wg.Done()
}

// worker pool
func createWorkerPool(n int64) {
    var wgPool sync.WaitGroup

    for i := int64(0); i < n; i++ {
        wgPool.Add(1)
        go worker(&wgPool)
    }

    wgPool.Wait()
    close(resultChan)
}

// create job
func createJob(n int64) {
    for i := int64(0); i < n; i++ {

        jobChan <- Job{i, rand.Int63n(999)}
    }
    close(jobChan)
}

// get result
func getResult() {
    for r := range resultChan {
        fmt.Println(r.job.ID, r.job.RandNum, r.Total)
    }
}

func main() {
    start := time.Now()

    go createJob(1000)
    go getResult()
    createWorkerPool(50)

    end := time.Now()

    fmt.Println("start: ", start, ", end: ", end, ", total: ", end.Sub(start))
}

createWorkerPool 由10 增加至 50, 计算时间缩减,效率提高

posted on 2023-01-29 10:04  北京涛子  阅读(86)  评论(0编辑  收藏  举报