Golang高同時ワークプール

1558 ワード

goプログラムの開発過程において、go func関数を簡単に呼び出すことにより、プログラムのデッドロックを招きやすく、無制限にgroutineを開くことになり、groutineの数が急増した場合にはコンカレント性能が著しく低下するため、ワークプールを使用してコンカレント数を制御し、高いコンカレント効果を達成することを考慮する必要がある.直接コード(JobPool.go)
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/