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()

}

  

原文地址:https://www.cnblogs.com/9527s/p/13574765.html