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

}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM