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");
}