go 工作池

     阅读(128)  2019-05-11 18:38:20

go工作池,类似如线程池,不断的往池子里丢任务,池子开启多个线程不断的处理任务。go这里其实只是对go chan defer的简单封装。

work/main.go

package work

import "sync"

type Pool struct {
    wg   sync.WaitGroup
    task chan func()
}

func New(size int) *Pool {
    p := &Pool{
        task: make(chan func()),
    }
    p.wg.Add(size)

    for i := 0; i < size; i++ {
        go func() {
            defer p.wg.Done()
            for task := range p.task {
                task()
            }
        }()
    }

    return p
}

func (p *Pool) Run(f func()) {
    p.task <- f
}

func (p *Pool) Shutdown() {
    close(p.task)
    p.wg.Wait()
}

使用:

package main

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

    "./work"
)

func init() {
    rand.Seed(time.Now().UnixNano())
}

func main() {
    start := time.Now().UnixNano()
    pool := work.New(20)

    for i := 0; i < 100; i++ {
        pool.Run(func() {
            time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
        })
    }
    pool.Shutdown()

    end := time.Now().UnixNano()
    fmt.Println("spent", (end-start)/1e6)
}

文章评论

Keep it simple,stupid
文章数
290
总访问量
305777
今日访问
420
最近评论

xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
tujiaw : 还不错哦
回到顶部