work_pool 协程池, 工作池


在工作中我们通常会使用可以指定启动的goroutine数量worker pool模式,控制goroutine的数量,防止goroutine泄漏和暴涨。

一个简易的work pool示例代码如下:

package main

import (
    "fmt"
    "time"
)

//var g sync.WaitGroup

func worker(id int, project chan int, result chan int) {

    for j := range project {
        fmt.Printf("worker:%d,start job:,%d\n", id, j)
        time.Sleep(time.Second)
        result <- j * 2
    }
}

func res(res chan int) {
    for {
        fmt.Printf("任务执行完毕,结果%d\n", <-res)
    }
}

func main() {

    project := make(chan int, 100)
    result := make(chan int)

    // 携程池 启动三个携程
    for i := 0; i <= 3; i++ {
        go worker(i, project, result)
    }

    // 生产五个任务 先执行完的协程会自动过取任务
    for j := 0; j <= 5; j++ {
        project <- j
    }

    // 取出结果
    go res(result)

    time.Sleep(time.Second * 3)

}

}

标签: none

添加新评论