協程池


基於生產者-消費者的設計。

任務數據結構 Task 自帶方法 exec() 負責執行Task任務的任意函數 f(),Pool的run()開啓N個消費者協程監聽共享無緩衝channel,生產者協程封裝數據id和函數t到數據結構Task,導入channel執行。

package main

import (
    "fmt"
    "time"
    "math/rand"
)

type Task struct {
    ProducerId int
    TaskId int
    f func() time.Time
}

func NewTask(id int, taskid int,f func() time.Time) *Task {
    return &Task{
        ProducerId: id,
        TaskId: taskid,
        f: f,
    }
}

type Pool struct {
    workerNum int
    workerChan chan *Task
}

func NewPool(num int) *Pool {
    return &Pool{
        workerNum: num,
        workerChan: make(chan *Task),
    }
}

func (p *Pool) worker(id int) {
    for task := range p.workerChan {
        fmt.Println(task.f(),": ConsumerId:", id, "ProducerId:", task.ProducerId, "TaskId:", task.TaskId,"is done")
    }
}

func (p *Pool) Run() {
    for i := 0; i < p.workerNum; i++ {
        go p.worker(i)
    }
}

func task() time.Time {
    return time.Now()
}

func main() {
    p := NewPool(10)
    p.Run()
    for producerId :=0; producerId < 15; producerId++ {
        go func(producerId int){
            for i := 0; i < 50; i++ {
                p.workerChan<-NewTask(producerId,rand.Int(),task)
            }
        }(producerId)
    }
    time.Sleep(3*time.Second)
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章