在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:Jeffail/tunny开源软件地址:https://github.com/Jeffail/tunny开源编程语言:Go 100.0%开源软件介绍:Tunny is a Golang library for spawning and managing a goroutine pool, allowing you to limit work coming from any number of goroutines with a synchronous API. A fixed goroutine pool is helpful when you have work coming from an arbitrary number of asynchronous sources, but a limited capacity for parallel processing. For example, when processing jobs from HTTP requests that are CPU heavy you can create a pool with a size that matches your CPU count. Installgo get github.com/Jeffail/tunny Or, using dep: dep ensure -add github.com/Jeffail/tunny UseFor most cases your heavy work can be expressed in a simple package main
import (
"io/ioutil"
"net/http"
"runtime"
"github.com/Jeffail/tunny"
)
func main() {
numCPUs := runtime.NumCPU()
pool := tunny.NewFunc(numCPUs, func(payload interface{}) interface{} {
var result []byte
// TODO: Something CPU heavy with payload
return result
})
defer pool.Close()
http.HandleFunc("/work", func(w http.ResponseWriter, r *http.Request) {
input, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, "Internal error", http.StatusInternalServerError)
}
defer r.Body.Close()
// Funnel this work into our pool. This call is synchronous and will
// block until the job is completed.
result := pool.Process(input)
w.Write(result.([]byte))
})
http.ListenAndServe(":8080", nil)
} Tunny also supports timeouts. You can replace the result, err := pool.ProcessTimed(input, time.Second*5)
if err == tunny.ErrJobTimedOut {
http.Error(w, "Request timed out", http.StatusRequestTimeout)
} You can also use the context from the request (or any other context) to handle timeouts and deadlines. Simply replace the result, err := pool.ProcessCtx(r.Context(), input)
if err == context.DeadlineExceeded {
http.Error(w, "Request timed out", http.StatusRequestTimeout)
} Changing Pool SizeThe size of a Tunny pool can be changed at any time with pool.SetSize(10) // 10 goroutines
pool.SetSize(100) // 100 goroutines This is safe to perform from any goroutine even if others are still processing. Goroutines With StateSometimes each goroutine within a Tunny pool will require its own managed state.
In this case you should implement When creating a pool using pool := tunny.New(poolSize, func() Worker {
// TODO: Any per-goroutine state allocation here.
return newCustomWorker()
}) This allows Tunny to create and destroy OrderingBacklogged jobs are not guaranteed to be processed in order. Due to the current implementation of channels and select blocks a stack of backlogged jobs will be processed as a FIFO queue. However, this behaviour is not part of the spec and should not be relied upon. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论