运维八一 运维八一
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)

运维八一

运维,运维!
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)
  • Go

    • 前言

    • Go基础知识

    • Go基本语法

    • 实战项目:简单web服务

    • 基本数据类型

    • 内置运算符

    • 分支和循环

    • 函数 function

    • 结构体 struct

    • 方法 method

    • 实战项目:跟踪函数调用链

    • 接口 interface

    • 并发 concurrency

    • 指针

    • 实战项目:实现轻量级线程池

      • 项目背景
      • workerpool的实现原理
        • 2. workerpool 的实现原理
      • v0_1 最小可行实现
      • v0_2 添加功能选项机制
    • 实战项目:实现TCP服务器

    • go常用包

    • Gin框架

    • go随记

  • Python

  • Shell

  • Java

  • Vue

  • 前端

  • 编程浅尝
  • Go
  • 实战项目:实现轻量级线程池
lyndon
2022-06-07
目录

workerpool的实现原理

# 2. workerpool 的实现原理

采用完全基于 channel+select 的实现方案,不使用其他数据结构,也不使用 sync 包提供的各种同步结构,比如 Mutex、RWMutex,以及 Cond 等。

workerpool 的实现主要分为三个部分:

  • pool 的创建与销毁;
  • pool 中 worker(Goroutine)的管理;
  • task 的提交与调度。

img

pool 对 worker 的管理:

  • capacity 是 pool 的一个属性,代表整个 pool 中 worker 的最大容量。使用一个带缓冲的 channel:active,作为 worker 的“计数器”,这种 channel 使用模式就是计数信号量。
  • 当 active channel 可写时,就创建一个 worker,用于处理用户通过 Schedule 函数提交的待处理的请求。
  • 当 active channel 满了的时候,pool 就会停止 worker 的创建,直到某个 worker 因故退出,active channel 又空出一个位置时,pool 才会创建新的 worker 填补那个空位。
  • 这张图里,把用户要提交给 workerpool 执行的请求抽象为一个 Task。Task 的提交与调度也很简单:Task 通过 Schedule 函数提交到一个 task channel 中,已经创建的 worker 将从这个 task channel 中读取 task 并执行。
上次更新: 2022/06/12, 15:48:09
项目背景
v0_1 最小可行实现

← 项目背景 v0_1 最小可行实现→

最近更新
01
ctr和crictl显示镜像不一致
03-13
02
alpine镜像集成常用数据库客户端
03-13
03
create-cluster
02-26
更多文章>
Theme by Vdoing | Copyright © 2015-2024 op81.com
苏ICP备18041258号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式