美文网首页
Go worker pool

Go worker pool

作者: mihope | 来源:发表于2019-03-06 17:21 被阅读0次
    // In this example we'll look at how to implement
    // a _worker pool_ using goroutines and channels.
    
    package main
    
    import "fmt"
    import "time"
    
    // Here's the worker, of which we'll run several
    // concurrent instances. These workers will receive
    // work on the `jobs` channel and send the corresponding
    // results on `results`. We'll sleep a second per job to
    // simulate an expensive task.
    func worker(id int, jobs <-chan int, results chan<- int) {
        for j := range jobs {
            fmt.Println("worker", id, "started  job", j)
            time.Sleep(time.Second)
            fmt.Println("worker", id, "finished job", j)
            results <- j * 2
        }
    }
    
    func main() {
    
        // In order to use our pool of workers we need to send
        // them work and collect their results. We make 2
        // channels for this.
        jobs := make(chan int, 100)
        results := make(chan int, 100)
    
        // This starts up 3 workers, initially blocked
        // because there are no jobs yet.
        for w := 1; w <= 3; w++ {
            go worker(w, jobs, results)
        }
    
        // Here we send 5 `jobs` and then `close` that
        // channel to indicate that's all the work we have.
        for j := 1; j <= 5; j++ {
            jobs <- j
        }
        close(jobs)
    
        // Finally we collect all the results of the work.
        for a := 1; a <= 5; a++ {
            <-results
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Go worker pool

          本文链接:https://www.haomeiwen.com/subject/idexpqtx.html