實現簡單的線程池,任務放在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()
}