ants——Go語言的高效能協程池

技術小能手發表於2018-09-29
ants 詳細介紹

github主頁:https://github.com/panjf2000/ants

ants是一個高效能的協程池,實現了對大規模goroutine的排程管理、goroutine複用,允許使用者在開發併發程式的時候限制協程數量,複用資源,達到更高效執行任務的效果。

功能

1. 實現了自動排程併發的goroutine,複用goroutine
2. 提供了友好的介面:任務提交、獲取執行中的協程數量、動態調整協程池大小
3. 資源複用,極大節省記憶體使用量;在大規模批量併發任務場景下比原生goroutine併發具有更高的效能

使用

寫 go 併發程式的時候如果程式會啟動大量的 goroutine ,勢必會消耗大量的系統資源(記憶體,CPU),通過使用 ants,可以例項化一個協程池,複用 goroutine ,節省資源,提升效能:

package main

import (
"fmt"
"sync"
"sync/atomic"

"github.com/panjf2000/ants"
"time"
)

var sum int32

func myFunc(i interface{}) error {
n := i.(int)
atomic.AddInt32(&sum, int32(n))
fmt.Printf("run with %d
", n)
return nil
}

func demoFunc() error {
time.Sleep(10 * time.Millisecond)
fmt.Println("Hello World!")
return nil
}

func main() {
runTimes := 1000

// use the common pool
var wg sync.WaitGroup
for i := 0; i < runTimes; i++ {
wg.Add(1)
ants.Submit(func() error {
demoFunc()
wg.Done()
return nil
})
}
wg.Wait()
fmt.Printf("running goroutines: %d
", ants.Running())
fmt.Printf("finish all tasks.
")

// use the pool with a function
// set 10 the size of goroutine pool
p, _ := ants.NewPoolWithFunc(10, func(i interface{}) error {
myFunc(i)
wg.Done()
return nil
})
// submit tasks
for i := 0; i < runTimes; i++ {
wg.Add(1)
p.Serve(i)
}
wg.Wait()
fmt.Printf("running goroutines: %d
", p.Running())
fmt.Printf("finish all tasks, result is %d
", sum)
}

本文來自雲棲社群合作伙伴“開源中國”

本文作者:達爾文

原文連結


相關文章