golang 协程池

package main

 

import (

    "fmt"

    "time"

)

 

type Pool struct {

    Queue chan func() error;

    RuntineNumber int;

    Total int;

 

    Result chan error;

    FinishCallback func();

}

 

//初始化

func (self *Pool) Init(runtineNumber int,total int)  {

    self.RuntineNumber = runtineNumber;

    self.Total = total;

    self.Queue = make(chan func() error, total);

    self.Result = make(chan error, total);

}

 

func (self *Pool) Start()  {

    //开启 number 个goruntine

    for i:=0;i<self.RuntineNumber;i++ {

        go func() {

            for {

                task,ok := <-self.Queue

                if !ok {

                    break;

                }

                err := task();

                self.Result <- err;

            }

        }();

    }

 

    //获取每个任务的处理结果

    for j:=0;j<self.RuntineNumber;j++ {

        res,ok := <-self.Result;

        if !ok {

            break;

        }

        if res != nil {

            fmt.Println(res);

        }

    }

 

    //结束回调函数

    if self.FinishCallback != nil {

        self.FinishCallback();

    }

}

 

//关闭

func (self *Pool) Stop()  {

    close(self.Queue);

    close(self.Result);

}

 

func (self *Pool) AddTask(task func() error)  {

    self.Queue <- task;

}

 

func (self *Pool) SetFinishCallback(fun func())  {

    self.FinishCallback = fun;

}

 

 

func main()  {

    var p Pool;

    url := []string{"11111","22222","33333","444444","55555","66666","77777","88888","999999"};

    p.Init(9, len(url));

 

    for i := range url {

        u := url[i];

        p.AddTask(func() error {

            return Download(u);

        });

    }

 

    p.SetFinishCallback(DownloadFinish);

    p.Start();

    p.Stop();

}

 

func Download(url string) error {

    time.Sleep(1*time.Second);

    fmt.Println("Download " + url);

    return nil;

}

 

func DownloadFinish()  {

    fmt.Println("Download finsh");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值