Golang 线程池

Posted qufo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang 线程池相关的知识,希望对你有一定的参考价值。

经常会用到协程,但是不能一下开那么多协调,只需要 poolSize 个即可,多了不行。这些个协程在执行完后必须等其完成之后才能进行下一步动作。假定工作方法为 work 。

 

package main

import (
    "fmt"
    "runtime"
    "sync"
    "time"
)
// WAIT GROUP
var wg sync.WaitGroup
var IDS_ALL = []int {40,42,43,44,164,166,171,173,174,175,177,518,192,193}

func main () {
    fmt.Println("BEGIN")

    poolSize := runtime.NumCPU()
    runtime.GOMAXPROCS(poolSize)

    ch := make(chan int,poolSize)
    for _,catid := range IDS_ALL {
        ch <- 1
        wg.Add(1)
        go work(catid,ch)
    }
    wg.Wait()
    close(ch)

    fmt.Println("DONE")
}

// 工作
func work(catid int,ch chan int) {

    fmt.Println("WORKING ",catid)
    time.Sleep(2 * 1e9)

    wg.Done()
    <-ch
}

 

 

就是这样。有问题,但能用。

以上是关于Golang 线程池的主要内容,如果未能解决你的问题,请参考以下文章

golang 实现线程池

Golang 线程池

线程池与并行度

golang协程调度模式解密

Java——线程池

Motan在服务provider端用于处理request的线程池