Go语言实现长连接并发框架 - 任务管理器

devtools/2024/10/18 10:14:49/

文章目录

  • 前言
  • 接口
  • 结构体
  • 接口实现
  • 项目地址
  • 最后

前言

你好,我是醉墨居士,我们上篇博客实现了路由分组的功能,接下来这篇博客我们将要实现任务管理模块

接口

trait/task_mgr.go

type TaskMgr interface {RouterGroupStart()StartWorker(taskQueue chan Request)Submit(request Request)
}

结构体

gcore/task_mgr.go

// TaskMgr 任务管理器
type TaskMgr struct {trait.RouterGrouptaskQueues []chan trait.Request
}// NewTaskMgr 创建任务管理器
func NewTaskMgr() trait.TaskMgr {taskQueues := make([]chan trait.Request, global.Config.TaskQueues)for i := 0; i < len(taskQueues); i++ {taskQueues[i] = make(chan trait.Request, global.Config.TaskQueueLen)}// 新建任务处理路由器与分组路由router := NewRouter()routerGroup := NewRouterGroup(router)return &TaskMgr{RouterGroup: routerGroup,taskQueues: taskQueues,}
}

接口实现

gcore/task_mgr.go

// Start 启动任务管理器
func (m *TaskMgr) Start() {for i := 0; i < len(m.taskQueues); i++ {for j := 0; j < global.Config.WorkersPerTaskQueue; j++ {go m.StartWorker(m.taskQueues[i])}}
}// StartWorker 启动任务消费者
func (m *TaskMgr) StartWorker(taskQueue chan trait.Request) {for request := range taskQueue {flow := m.TaskFlow(request.ID())ctx := NewContext(request, flow)ctx.Next()}
}// Submit 提交任务
func (m *TaskMgr) Submit(request trait.Request) {m.taskQueues[int(request.ConnID()) % len(m.taskQueues)] <- request
}// Use 注册插件
func (m *TaskMgr) Use(flow ...trait.TaskFunc) {m.RouterGroup.Use(flow...)
}// Regist 注册任务流
func (m *TaskMgr) Regist(id uint16, flow ...trait.TaskFunc) {m.RouterGroup.Regist(id, flow...)
}// Regist 注册任务流
func (m *TaskMgr) RegistFlow(id uint16, flow trait.TaskFlow) {m.RouterGroup.RegistFlow(id, flow)
}

项目地址

Github:https://github.com/zm50/gte
Giee:https://gitee.com/zm50/gte

最后

我是醉墨居士,我们完成了基本的任务管理器的开发,希望对你有所帮助,也希望你有所收获


http://www.ppmy.cn/devtools/124242.html

相关文章

Frp云服务器与PC机器实现内外网穿透

Frp&#xff08;Fast Reverse Proxy&#xff09;是一个高性能的反向代理应用&#xff0c;它支持TCP、UDP、HTTP、HTTPS等协议&#xff0c;可以帮助实现内网穿透&#xff0c;使得内网的服务可以通过公网进行访问。Frps为服务端、Frpc为客户端。 以下是使用Frp在云服务器上进行内…

LVM——让Linux磁盘空间的弹性管理

什么是LVM&#xff1f; LVM(Logical Volume Manager)逻辑卷管理是在Linux2.4内核以上实现的磁盘管理技术。它是Linux环境下对 磁盘分区进行管理的一种机制。现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制&#xff0c;对于其它的类UNIX操作系统&#xff0c;以及windows操…

【Kubernetes】常见面试题汇总(五十七)

目录 125. K8S 创建服务 status 为 ErrlmagePull&#xff1f; 126.不能进入指定容器内部&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 …

React高阶组件详解

React高阶组件&#xff08;HOC&#xff09;详解 定义 React高阶组件&#xff08;HOC&#xff09;是一个函数&#xff0c;该函数接受一个组件作为参数并返回一个新的组件。高阶组件本身不是一个组件&#xff0c;而是一个函数&#xff0c;它利用React的组合特性&#xff0c;对传入…

医院管理自动化:Spring Boot技术实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

第二阶段:mysql(学完就隐藏版)

第一章&#xff1a;部署数据库系统&#xff08;注意关闭防火墙&#xff0c;selinux安装&#xff09; 安装mysql配置的相关文件&#xff1a;yum install https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm&#xff08;centos9&#xff1a;yum install http…

selenium的 presence_of_element_located 与 invisibility_of_element_located的区别

presence_of_element_located直到元素出现 invisibility_of_element_located直到元素可见 详解 presence_of_element_located&#xff1a;判断某个元素是否被加到了dom树里&#xff0c;并不代表该元素一定可见&#xff1b;校验程度轻一些&#xff0c;在页面跳转之后判断某种标…

MoveIt2-humble】入门教程----第一个 C++ MoveIt 程序

四节教程会手把手带你写一个完整的 Moveit 控制程序&#xff0c;包括轨迹规划、RViz可视化、添加碰撞物体、抓取和放置。 1 创建依赖包 进入到教程所在工作空间下的src目录&#xff0c;创建一个新的依赖包。 ros2 pkg create \--build-type ament_cmake \--dependencies mov…