zoukankan      html  css  js  c++  java
  • golang实现简单线程池

    实现简单的线程池,任务放在entry中,线程池开启后会创建相应数目的线程,不断从entry中拿取任务放在work管道中,并且不断从work中取出任务运行

    package main
    
    import "fmt"
    var count int
    type Task struct {
    	myfun func()error
    }
    
    func NewTask(fun func()error)*Task  {
    	return &Task{
    		myfun: fun,
    	}
    }
    
    func (m*Task)Excute()  {
    	m.myfun()
    }
    
    type GroutinePool struct {
    	Sum int
    	EntryTask chan *Task
    	WorkTask chan *Task
    }
    
    func NewGroutinePool(sum int)*GroutinePool  {
    	return &GroutinePool{
    		Sum: sum,
    		EntryTask: make(chan *Task),
    		WorkTask: make(chan *Task),
    	}
    }
    
    func (pool*GroutinePool)Work(workid int)  {
    	for task:=range pool.WorkTask{
    		task.Excute()
    		count++
    		fmt.Println("第几个线程执行完成",workid,"执行次数",count)
    	}
    
    }
    
    func (pool*GroutinePool)Run()  {
    	for i:=0;i<pool.Sum;i++{
    		go func() {
    			pool.Work(i)
    		}()
    	}
    	for task:=range pool.EntryTask{
    		pool.WorkTask<-task
    	}
    }
    
    func testwork() error {
    	fmt.Println("这是一个测试任务")
    	return nil
    }
    func main()  {
    	p:=NewGroutinePool(40)
    	go func() {
    		for {
    			p.EntryTask<-NewTask(testwork)
    		}
    	}()
    
    	p.Run()
    
    }
    

      

  • 相关阅读:
    flash 异性窗体
    ASCⅡ 表 关键字符
    VC 中显示位图的步骤
    输出电脑的所有Mac地址
    const char* 和 char* const
    C# 生成PDF
    vc6显示行号
    纪念一下。
    MII接口全家福
    Virtex6 GTX设计总结:预加重、均衡、输出振幅的值
  • 原文地址:https://www.cnblogs.com/9527s/p/13574765.html
Copyright © 2011-2022 走看看