Golang高同時ワークプール
1558 ワード
goプログラムの開発過程において、go func関数を簡単に呼び出すことにより、プログラムのデッドロックを招きやすく、無制限にgroutineを開くことになり、groutineの数が急増した場合にはコンカレント性能が著しく低下するため、ワークプールを使用してコンカレント数を制御し、高いコンカレント効果を達成することを考慮する必要がある.直接コード(JobPool.go)
使用方法
参考記事:http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/
package utils
import (
"fmt"
)
// ,
type Task interface {
DoTask() error
}
//
type Job struct {
Task Task
}
//
var JobQueue chan Job
//
type Worker struct {
WorkerPool chan chan Job //
JobChannel chan Job // Job
quit chan bool
}
//
func NewWorker(workerPool chan chan Job) Worker {
return Worker{
WorkerPool: workerPool, //
JobChannel: make(chan Job), //
quit: make(chan bool),
}
}
//
func(w *Worker)Start(){
//
go func() {
for{
//
w.WorkerPool
使用方法
package main
import (
"fmt"
"os"
"test/utils" // : JobPool test utils
"time"
)
type Test struct {
num int
}
// , JobPool Task
func(t *Test)DoTask() error{
f, err := os.OpenFile("log.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0777)
if err != nil {
return err
}
defer f.Close()
f.WriteString(fmt.Sprintf(" :%d , :%s
", t.num, fmt.Sprintf("%s", time.Now())))
return nil
}
func main(){
//
utils.InitPool()
for i:=1;i<40 ;i++{
// Job
task := &Test{i}
utils.JobQueue
参考記事:http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang/