golang: work pool

证始 · · 99 次点击 · · 开始浏览    

1. 使用goroutine和channel实现一个计算int64随机数各位和的程序

  1. 开启一个goroutine循环生成int64类型的随机数,发送到jobChan
  2. 开启24个goroutine 从jobChan取出随机数并计算各位各位数的和,将结果发送到resultChan
  3. 主goroutine从resultChan取出结果并打印到终端输出
package main

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

type Job struct {
    value int64
}

type Result struct {
    job *Job
    sum int64
}

var wg sync.WaitGroup
var jobChan = make(chan *Job, 100)
var resultChan = make(chan *Result, 100)

func producer(job chan<- *Job) {
    defer wg.Done()
    for {
        newJob := &Job{
            value: rand.Int63(),
        }
        job <- newJob
        time.Sleep(time.Microsecond * 500)
    }
}

func consumer(z1 <-chan *Job, resultChan chan<- *Result) {
    defer wg.Done()
    for {
        job1 := <-z1
        result := int64(0)
        n := job1.value
        for n > 0 {
            result += n % 10
            n = n / 10
        }
        newResult := &Result{
            job: job1,
            sum: result,
        }
        resultChan <- newResult
    }
}
func main() {
    wg.Add(1)
    go producer(jobChan)
        wg.Add(24)
    for i := 0; i < 24; i++ {
        go consumer(jobChan, resultChan)
    }
    for result := range resultChan {
        fmt.Printf("value:%d sum:%d\n",result.job.value,result.sum)
    }
    wg.Wait()
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:证始

查看原文:golang: work pool

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459

99 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传