//https://studygolang.com/pkgdoc //go语言学习文档
package main
import (
"fmt"
"time"
)
// 任务结构体
type Task struct {
f func()
}
func NewTask(arg_f func()) *Task {
//创建Task
t := Task{
f:arg_f,
}
return &t
}
// 任务执行方法
func (t *Task) Execute() {
t.f()
}
// 协程池结构体
type Pool struct {
//入口队列
EntryChannel chan *Task
//内部队列
JobsChannel chan *Task
//协程池大小
worker_num int
}
func NewPool(num int) *Pool {
//创建Pool
p := Pool{
EntryChannel: make(chan *Task),
JobsChannel: make(chan *Task),
worker_num: num,
}
return &p
}
// 工作方法
func (p *Pool) worker(worker_ID int) {
// 持续从内部队列中获取任务执行
for task := range p.JobsChannel {
task.Execute()
fmt.Println("worker ID ", worker_ID, "执行完毕")
}
}
func (p *Pool) run() {
// 创建最大数量工作协程
for i:=0; i<p.worker_num; i++ {
go p.worker(i)
}
// 持续从入口队列获取任务放进内部队列
for task := range p.EntryChannel {
p.JobsChannel <- task
}
}
func main() {
t := NewTask(func() {
fmt.Println(time.Now())
})
p := NewPool(4)
go func() {
for {
p.EntryChannel <- t
}
}()
p.run()
}