Go 之缓冲通道限制协程并发数目

并发执行的协程太多可能会对系统资源的消耗特别大,从而导致其它进程服务受到影响,因此协程执行时应该设计一种机制,来限制并发执行的协程数目。

其中 WaitGroup 主要用作协程同步,当所有协程都执行完毕以后,才会结束主线程。每个任务开始执行前,都会先往缓冲通道写入空结构体数据(用于占位),如果通道已满,则会阻塞,直到通道数据被其他协程取出释放后当前协程才可以继续执行。

package main

import (
	"fmt"
	"sync"
	"time"
)

func worker(id int, sem chan struct{}) {
	sem <- struct{}{}
	defer func() {
		<-sem
	}()
	fmt.Printf("%s: Worker %d starting...\n", time.Now().Format("2006-01-02 15:04:05"), id)
	time.Sleep(2 * time.Second)
	fmt.Printf("Worker %d done\n", id)
}

func main() {
	concurrency := 3
	sem := make(chan struct{}, concurrency)
	var wg sync.WaitGroup

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			worker(id, sem)
		}(i)
	}
	wg.Wait()
	close(sem)
}
2024-04-09 09:27:25: Worker 1 starting...
2024-04-09 09:27:25: Worker 3 starting...
2024-04-09 09:27:25: Worker 0 starting...
Worker 3 done
Worker 0 done
2024-04-09 09:27:27: Worker 4 starting...
2024-04-09 09:27:27: Worker 2 starting...
Worker 1 done
2024-04-09 09:27:27: Worker 5 starting...
Worker 5 done
2024-04-09 09:27:29: Worker 6 starting...
Worker 4 done
2024-04-09 09:27:29: Worker 9 starting...
Worker 2 done
2024-04-09 09:27:29: Worker 8 starting...
Worker 6 done
Worker 9 done
Worker 8 done
2024-04-09 09:27:31: Worker 7 starting...
Worker 7 done

相关推荐

  1. Go 缓冲通道限制并发数目

    2024-04-12 16:22:03       16 阅读
  2. <span style='color:red;'>go</span> <span style='color:red;'>协</span><span style='color:red;'>程</span>

    go

    2024-04-12 16:22:03      6 阅读
  3. 优雅的控制(goroutine)的并发数量

    2024-04-12 16:22:03       33 阅读
  4. Go实现简单的池(通过channel实现)

    2024-04-12 16:22:03       19 阅读
  5. go从入门到精通】精通并发编程-goroutine

    2024-04-12 16:22:03       12 阅读
  6. Golang 通道

    2024-04-12 16:22:03       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-12 16:22:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-12 16:22:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-12 16:22:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-12 16:22:03       20 阅读

热门阅读

  1. C语言什么是寄存器变量?如何实现?

    2024-04-12 16:22:03       16 阅读
  2. 36岁程序员,10年前错过了阿里,我一点都不后悔

    2024-04-12 16:22:03       17 阅读
  3. 【蓝桥杯日常】

    2024-04-12 16:22:03       12 阅读
  4. Composer安装与配置详解

    2024-04-12 16:22:03       16 阅读
  5. 蓝桥杯省B组复习(小白篇)

    2024-04-12 16:22:03       14 阅读
  6. C++ 的内存安全与效率

    2024-04-12 16:22:03       15 阅读
  7. 力扣经典150题第十八题:整数转罗马数字

    2024-04-12 16:22:03       19 阅读
  8. 《访问者模式(极简c++)》

    2024-04-12 16:22:03       15 阅读
  9. Erlang 常用数据结构实现

    2024-04-12 16:22:03       17 阅读