zoukankan      html  css  js  c++  java
  • 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");
    }
    

      

  • 相关阅读:
    最快速的Android开发环境搭建ADT-Bundle及Hello World
    android sdk manager 无法更新解决方法
    ADO.NET 新特性之SqlBulkCopy
    WCF错误:413 Request Entity Too Large
    构建高性能的ASP.NET应用程序
    编写高性能Web应用程序的10个技巧
    很不错的jQuery学习资料和实例
    学习jQuery之旅
    50个常用的JQuery代码
    机器学习瓶颈
  • 原文地址:https://www.cnblogs.com/hanyouchun/p/6369736.html
Copyright © 2011-2022 走看看