美文网首页
Go语言小技巧(1)-控制并发数

Go语言小技巧(1)-控制并发数

作者: 陈先生_9e91 | 来源:发表于2018-09-20 15:12 被阅读0次

Go语言小技巧(1)-控制并发数

需求

虽然goroutine很廉价,但是有时候还是希望控制goroutine并发数。

实现

来自K8S源代码

k8s.io\client-go\util\workqueue\parallelizer.go

type DoWorkPieceFunc func(piece int)

// Parallelize is a very simple framework that allow for parallelizing
// N independent pieces of work.

func Parallelize(workers, pieces int, doWorkPiece DoWorkPieceFunc) {
    toProcess := make(chan int, pieces)
    for i := 0; i < pieces; i++ {
        toProcess <- i
    }
    close(toProcess)

    if pieces < workers {
        workers = pieces
    }

    wg := sync.WaitGroup{}
    wg.Add(workers)
    for i := 0; i < workers; i++ {
        go func() {
            defer utilruntime.HandleCrash()
            defer wg.Done()
            for piece := range toProcess {
                doWorkPiece(piece)
            }
        }()
    }
    wg.Wait()
}

分析

  • workers: int, goroutine并发数
  • pieces: int, 任务总数
  • doWorkPiece: func(piece int),任务处理函数
  1. 将任务索引全部放入channel中;
  2. 通过for循环,创建worker个goroutine;
  3. 每个goroutine从channel中领取任务

相关文章

  • Go语言小技巧(1)-控制并发数

    Go语言小技巧(1)-控制并发数 需求 虽然goroutine很廉价,但是有时候还是希望控制goroutine并发...

  • Go语言并发

    Go语言并发 Go语言级别支持协程,叫做goroutine Go 语言从语言层面支持并发和并行的开发操作 Go并发...

  • Go基础语法(九)

    Go语言并发 Go 是并发式语言,而不是并行式语言。 并发是指立即处理多个任务的能力。 Go 编程语言原生支持并发...

  • Go 并发原理

    Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数...

  • go语言中控制并发数量的方法

    因为go语言层面支持并发,所以面试中经常会问到并发的问题,比如说控制go并发数量的方式有哪些? 下面是我个人整理的...

  • Go并发

    并发和并行 Go是并发语言,而不是并行语言。(Go is a concurrent language and no...

  • GO语言初级学习之代码案例13 (QQ群聊)

    @(go语言 黑马)[GO语言] 并发聊天室 题目:利用Go语言高并发的特性,编写一个类似QQ群聊功能的并发聊天服...

  • Go语言高并发Map解决方案

    Go语言高并发Map解决方案 Go语言基础库中的map不是并发安全的,不过基于读写锁可以实现线程安全;不过在Go1...

  • 14 Go并发编程(一):协程 —— Go并发的基本运行单元

    Go协程 1.什么是goroutine? Go在语言级别原生支持并发操作,这在现代众多基于线程并发的其他语言来看是...

  • 第14章-并发性Concurrency

    并发性Concurrency 1.1 什么是并发 Go是并发语言,而不是并行语言。在讨论如何在Go中进行并发处理之...

网友评论

      本文标题:Go语言小技巧(1)-控制并发数

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