重写Sylar基于协程的服务器(4、协程调度模块的设计)

2024-02-03 21:28

本文主要是介绍重写Sylar基于协程的服务器(4、协程调度模块的设计),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

重写Sylar基于协程的服务器(4、协程调度模块的设计)

重写Sylar基于协程的服务器系列:

重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar)

重写Sylar基于协程的服务器(1、日志模块的架构)

重写Sylar基于协程的服务器(2、配置模块的设计)

重写Sylar基于协程的服务器(3、协程模块的设计)

重写Sylar基于协程的服务器(4、协程调度模块的设计)

重写Sylar基于协程的服务器(5、IO协程调度模块的设计)

简述

协程调度模块:让线程池里的每个线程都运行调度协程,并不断切换去执行协程任务。

协程调度器整体架构图

sylar实现的协程是非对称协程,虽然就调度器的架构看来,很反人类,一眼看去很像是对称协程。

问了一下GPT,回答如下:

实现了 IO Hook 模块的协程通常是非对称协程模型。在异步编程中,IO Hook 通常用于异步 IO 操作,而非对称协程模型更适合处理异步 IO 操作。

在非对称协程模型中,一个主协程(通常是事件循环或主任务)可以通过 IO Hook 来注册感兴趣的 IO 事件,并在事件发生时启动相应的协程执行。这样的模型更适用于事件驱动的编程,其中主协程负责管理整体的控制流,而子协程负责处理具体的 IO 操作。

协程调度器模块的设计是基于线程池来完成的,对线程池进行协程的定制化改造,让线程池模型能够适应协程的切换,如图:

调度器架构

协程调度模块设计

  1. 构造函数,用户创建协程调度器主要的参数有,设置参与协程调度的线程数量threadCount、主线程是否参与协程调度等,构造函数首先会为主线程原始的上下文创建一个协程(t_threadFiber),其次,如果用户指定了主协程需要参与协程调度,就会为成员变量m_rootFiber创建一个回调函数是Scheduler::run()的协程,并且指定该协程与t_threadFiber做上下文切换。主线程等待后面延迟将m_rootFiber切入,进入Scheduler::run()函数后,t_threadFiber保存主线程原始上下文,t_schRunFiber赋值为m_rootFiber即运行Scheduler::run()函数的协程。而子线程运行的回调函数就是Scheduler::run()函数,所以,子线程的t_threadFiber和t_schRunFiber是同一个协程对象。并且,因为主线程充当了一个调度协程,所以,创建子线程的时候,会少创建一个线程,即子线程的数量等于threadCount-1。当用户没有要使用主线程充当调度协程时,调度器最后会创建threadCount个子线程。

  2. Scheduler::run,协程调度部分,进入调度函数最开始会初始化t_threadFiber和t_schRunFiber变量,然后进入调度循环,在调度循环中,首先到任务队列中取任务,取到任务时,判断任务是协程还是回调,如果是协程,判断协程状态的合法性,只有合法的协程才能切入去执行,对于回调,会被封装成协程,再切入去执行。如果没有任务,就会去执行idle协程,idle协程是IO协程调度模块的重点,主要负责等待事件的到来然后唤醒相应任务协程。

    协程调度函数Scheduler::run伪代码:

    伪代码

  3. Scheduler::isStop,当用户调用了成员stop函数,且任务队列队列为空,且没有任何线程正在执行协程任务,即可认为整个协程调度器停止了,此时该函数返回true。

下一章将介绍IO协程调度模块。

感兴趣的同学,可以阅读一下本文实现的源码:https://github.com/LunarStore/lunar


本章完结

这篇关于重写Sylar基于协程的服务器(4、协程调度模块的设计)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675463

相关文章

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from