后端技术总结

  • 首页
  • github
  • About Me
  1. 首页
  2. Golang
  3. 正文

基于chan实现的简易协程池及说明

2021年10月11日 1436点热度 1人点赞 0条评论
内容纲要

背景

项目开发时,在某些业务场景我们可能需要控制服务的并发数量,不想引入比较复杂的协程池,只想简单实现。下面我们就可以利用channel特性,几行代码搞定这个需求!

代码实现

package main

import (
    "fmt"
    "time"
)

var (
    sig      chan struct{}
    poolSize = 3 // 用来控制同步并发大小
)

func init() {
    sig = make(chan struct{}, poolSize)
}

func simplePool() {
    select {
    case sig <- struct{}{}: // 写入成功说明管道中有多余空闲位置
        break
    default: // 说明管道已经满了
        fmt.Println("busy")
        return
    }
    defer func() { <-sig }() // 函数执行完成后消费管道中的一个数据,给其余协成继续使用的机会

    // todo something
    fmt.Println("ok")
}

func main() {
    for i := 0; i < 10; i++ {
        go simplePool()
    }
    time.Sleep(2 * time.Second)
}

说明

以上如果只算上有效代码的话仅仅十来行,写法简单,所适应的场景也很明确:用来简单的控制协程的并发。
之所以说它简单,是因为它不能像真正的协程池那样避免协程的创建和销毁这两步操作,如果需要功能完善的可以参考:github.com/panjf2000/ants

标签: 暂无
最后更新:2021年10月11日

PingD

反思让我成长

点赞
< 上一篇
下一篇 >

文章评论

取消回复

PingD

反思让我成长

归档
  • 2023年1月
  • 2022年3月
  • 2022年1月
  • 2021年10月
  • 2021年8月
  • 2021年4月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2019年9月
  • 2019年7月
  • 2019年6月
  • 2019年4月
  • 2019年3月
最新 热点 随机
最新 热点 随机
断更了,不想写了 新路由2(newifi d1) 小白刷老毛子固件 2021年度总结 golang之从源码角度看slice的len和cap 基于chan实现的简易协程池及说明 订单超时方案(初稿)
golang之从源码角度看slice的len和cap Etcd raft 原理动画演示 Golang之服务配置自动初始化 Golang之go get golang.org/x timeout Golang之HTTP EOF/connection reset by peer详解 could not launch process: decoding dwarf section info at offset 0x0: too short
最近评论

COPYRIGHT © 2021 dpjeep.com. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

蜀ICP备18036663号-1