当前位置: 首页 > news >正文

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

文章目录

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

前言

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

接口

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.lryc.cn/news/452746.html

相关文章:

  • 【大数据】深入解析分布式数据库:架构、技术与未来
  • uniapp框架中实现文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
  • GEE教程:NASA/GRACE/MASS_GRIDS/LAND数据的查看不同时期液态水数据的变化情况
  • 世邦通信股份有限公司IP网络对讲广播系统RCE
  • 爬虫——爬取小音乐网站
  • 5G NR SSB简介
  • java将mysql表结构写入到word表格中
  • SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境)
  • day2网络编程项目的框架
  • C++和OpenGL实现3D游戏编程【连载13】——多重纹理混合详解
  • 探索云计算中的 Serverless 架构:未来的计算范式?
  • 爬虫及数据可视化——运用Hadoop和MongoDB数据进行分析
  • 扩散引导语言建模(DGLM):一种可控且高效的AI对齐方法
  • LeetCode hot100---数组及矩阵专题(C++语言)
  • LabVIEW提高开发效率技巧----快速实现原型和测试
  • 大论文记录
  • 蘑菇分类检测数据集 21类蘑菇 8800张 带标注 voc yolo
  • dockerhub 镜像拉取超时的解决方法
  • 私家车开车回家过节会发生什么事情
  • 正则表达式的使用示例--Everything文件检索批量重命名工具
  • centos环境安装JDK详细教程
  • Spring Cloud全解析:服务调用之OpenFeign集成OkHttp
  • 前端算法合集-1(含面试题)
  • 影刀---如何进行自动化操作
  • 146. LRU 缓存【 力扣(LeetCode) 】
  • 【算法】链表:92.反转链表(medium)+双指针
  • Command | Ubuntu 个别实用命令记录(新建用户、查看网速等)
  • 云服务器部署k8s需要什么配置?
  • Linux --入门学习笔记
  • 并发编程三大特性(原子性、可见性、有序性)