zoukankan      html  css  js  c++  java
  • go语言从例子开始之Example33.工作池

    在这个例子中,我们将看到如何使用 Go 协程和通道实现一个工作池 。

    Example:

    package main
    import "fmt"
    import "time"
    
    //这是我们将要在多个并发实例中支持的任务了。这些执行者将从 jobs 通道接收任务,
    //并且通过 results 发送对应的结果。我们将让每个任务间隔 1s 来模仿一个耗时的任务
    func worker(id int, jobs <-chan int, results chan<- int){
        for j := range jobs{
            fmt.Println("worker", id ,"processing job", j)
            time.Sleep(time.Second)
            results <- j * 2
        }
    }
    
    
    func main() {
        //为了使用 worker 工作池并且收集他们的结果,我们需要2 个通道。
        jobs := make(chan int, 100)
        results := make(chan int, 100)
        
        //这里启动3个worker,初始是阻塞的,因为还没有传递任务。
        for i:=1; i<=3; i++{
            go worker(i, jobs, results)
        }
    
        //这里发送9个jobs,并且close关闭通道。代表所有任务
        for j:=1; j<=9; j++{
            jobs <- j
        }
        close(jobs)
    
        //最后,我们收集所有这些任务的返回值。results
        for a:=1; a<=9; a++{
            <- results
        }
    
    
    }

    Result:

    $ go run example.go
    worker 3 processing job 1
    worker 1 processing job 2
    worker 2 processing job 3
    worker 3 processing job 4
    worker 2 processing job 5
    worker 1 processing job 6
    worker 3 processing job 7
    worker 1 processing job 8
    worker 2 processing job 9

    执行这个程序,显示 9 个任务被多个 worker 执行。整个程序处理所有的任务仅执行了 3s 而不是 9s,是因为 3 个 worker是并行的。

     

    坐标: 上一个例子      下一个例子

     

  • 相关阅读:
    MySQL数据库触发器
    软碟通制作fedora17 U盘启动的方法
    编译自己功能定制的Fedora7内核
    SUSE Linux 10配置裸设备(raw devices)
    linux之cut用法
    python---opencv常用函数
    vscode安装以及如何连接服务器
    pip 安装包问题汇总
    conda创建环境失败的解决方法
    git操作
  • 原文地址:https://www.cnblogs.com/yhleng/p/11758478.html
Copyright © 2011-2022 走看看