學習之路 / goroutine 併發協程池設計及實現

臺北下了雪發表於2021-11-21
package main

import (
    "fmt"
    "time"
)

// 編寫協程池
// pool->JobChan->EntryChan->task

type task struct {
    handler func() error
}

func NewTask(f func() error) task {
    return task{
        handler: f,
    }
}

type pool struct {
    EntryChan chan task
    JobsChan  chan task
    WorkNum   int8
}

func NewPool(wn int8) pool {

    return pool{
        EntryChan: make(chan task, 100),
        JobsChan:  make(chan task, 100),
        WorkNum:   wn,
    }
}

func (p pool) Worker(wid int) {
    for task := range p.JobsChan {
        task.handler()
        fmt.Printf("WorkId: %d 執行完成\n", wid)
    }
}

func (p pool) Run() {
    for task := range p.EntryChan {
        p.JobsChan <- task
    }
}

func main() {
    // 建立任務
    task := NewTask(func() error {
        // 你的任務邏輯
        fmt.Println("執行任務中...", time.Now().Format("2006-01-02 15:04:05"))
        return nil
    })
    // 初始化協程池 ( 如 4 個)
    p := NewPool(4)
    //建立 worker 等待執行任務
    for i := 0; i < int(p.WorkNum); i++ {
        go p.Worker(i)
    }
    go func() {
        // 派發任務
        for {
            p.EntryChan <- task
            time.Sleep(1 * time.Second)
        }
    }()

    // 執行協程池
    p.Run()
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章