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

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

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

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

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

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

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

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

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

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

重写Sylar基于协程的服务器(7、TcpServer & HttpServer的设计与实现)

简述

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

协程调度器整体架构图

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


本章完结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为机考入门python3--(8)牛客8-合并表记录

分类:字典排序 知识点: 将输入转成int的列表 my_list list(map(int, input().strip().split( ))) 将列表转为元组 tuple(my_list) 访问元素为元组的列表 for first, second, third in my_list: 对字典进行排序 sorted(my_dict.items())…

负载均衡下的webshell上传+nginx解析漏洞

负载均衡下的webshell上传 一,负载均衡下webshell上传的四大难点 难点一:需要在每一台节点的相同位置上传相同内容的webshell 我们需要在每一台节点的相同位置都上传相同内容的 WebShell一旦有一台机器上没有,那么在请求轮到这台机器上的时…

处理SERVLET中的错误

处理SERVLET中的错误 问题陈述 一位用户在使用在线计算机应用程序时输入一个非数字字符做数字加法。servlet试图将用户输入的值转换成整数型时,引发了NumberFormException类型的异常。要创建一个Web应用程序来使用自定义错误页面处理该异常。该自定义错误页面需要向用户提供关…

学习MySQL ENUM数据类型

学习MySQL ENUM数据类型 ENUM是MySQL中的一个字符串对象,它允许从预定义的值列表中选择一个值。这种数据类型特别适用于值的数量有限且不太可能变化的情况。 定义ENUM类型 在定义ENUM类型时,你需要明确列出所有可能的字符串值。例如: CRE…

Linux命令-arpd命令(收集免费ARP信息)

说明 arpd命令 是用来收集免费arp信息的一个守护进程,它将收集到的信息保存在磁盘上或者在需要时, 提供给内核用户用于避免多余广播。 语法 arpd(选项)(参数)选项 -l:将arp数据库输出到标准输出设备显示并退出; -f:指…

【Linux】Ext2 文件系统

文件系统 前言一、磁盘硬件1. 磁盘的物理存储结构2. 磁盘存储的逻辑抽象结构 二、理解 Ext2 文件系统1. 初步理解文件系统2. 深入理解文件系统(1)inode Table(2)Data blocks(3)inode Bitmap(4&a…

【Vue】2-9、Vue-CLI 脚手架

一、单页面程序 什么是单页面程序? 单页面程序(Single Page Application)简称 SPA,顾名思义,指的是一个 Web 网站中只有唯一一个 HTML 页面,所有的功能与交互都在这唯一的一个页面内完成。 二、Vue-CLI …

万能写作辅助器设计

为了构建一个万能写作辅助器,我们需要设计几个关键组件,每个组件都有其特定的功能和交互方式。以下是这些组件的详细设计和描述: 对话生成器(Dialogue Generator) 功能:生成对话内容。输入:可接受拖拽过来的组件,如角色名称、情感标签、场景描述等。管理:能够管理各种…

Golang中的HTTP请求凝聚器

HTTP请求凝聚器是一种请求优化机制,它将多个HTTP请求合并为一个。通过将性质相似的请求归为较大的批次,我们可以减少不必要的网络流量,提高工作效率。 利用goroutines和通道,我们可以在Golang中创建一个HTTP请求凝聚器。goroutine…

【学习笔记】详解换根法(换根DP)

一.换根DP的概念 1.换根DP是什么? 换根DP,又叫二次扫描,是树形DP的一种。 2.换根DP能解决什么问题? 换根DP能解决不指定根结点,并且根节点的变化会对一些值产生影响的问题。例如子结点深度和、点权和等。如果要 暴力…

java社区养老年人服务系统springboot+vue

为了帮助用户更好的了解和理解程序的开发流程与相关内容,本文将通过六个章节进行内容阐述。 第一章:描述了程序的开发背景,程序运用于现实生活的目的与意义,以及程序文档的结构安排信息; 第二章:描述了程序…

代码随想录算法训练营第二十二天|216.组合总和III,17.电话号码的字母组合

系列文章目录 代码随想录算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素 代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 代码随想录算法训练营第三天|链表理论基础&#xff…

python Cloudflare 批量关闭IPv6兼容性脚本

Cloudflare免费版控制台不给关IPv6,需要使用API关闭,先从我的个人资料里面申请API令牌,再执行脚本 import requests import jsonheaders {X-Auth-Email:cloudflare登入账户, #输入登入账户的邮箱X-Auth-Key: Global API Key, #输入上图申请…

鸿蒙系统对应安卓版本

鸿蒙系统对应安卓版本 使用安卓studio 新建一个app 然后添加代码打印: Log.d(“MainActivity”, "SDK Version: " Build.VERSION.SDK_INT); 或者把 Build.VERSION.SDK_INT 添加到显示的字符串上面 我这里 build.gradle.kts 配置 android {compileSdk…

MySQL十部曲之七:InnoDB索引及其优化措施

文章目录 前言什么是索引聚集索引和二级索引索引的创建和删除单列和多列索引列前缀索引表达式索引UNIQUE索引 索引优化MySQL是怎样使用索引的优化措施 前言 如果不懂平衡二叉树、B树和B树(属于数据结构搜索算法相关内容),那阅读本文意义不大…

rancher迁移账号密码

1. 登陆rancher容器获取user【docker部署和helm部署都一样,进到容器内都是同一路径】 $ kubectl get user NAME AGE u-222ms 82m u-4j5jf 82m u-b4qkhsnliz 139d u-fvj64 83m u-jn58d 84m u-llw8l 83m u-mo773ytt…

数据结构(C语言)代码实现(六)——单链表的实现

目录 参考、格式 头文件LinkList.h 一、将函数的小括号写成中括号 二、读取权限冲突 三、L->Last指针没有移动 四、函数指针的使用 头文件完整代码 测试函数(主函数)test.cpp 测试结果 参考、格式 数据结构课本2.3节(严蔚敏版&a…

SQLite

SQLite语法 大小写敏感性 有个重要的点值得注意,SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义 注释 SQL 注释以两个连续的 "-" 字符(ASCII 0x2d&#…

嵌入式学习第三篇——51单片机

目录 1,嵌入式系统 1,嵌入式系统的定义 2,单片机的定义 2,51单片机 1,开发环境 2,开发板使用的基本思路 1,查看原理图,查看芯片手册 2,获得调用硬件的管…

博途PLC限幅器(SCL代码)

PLC限幅器详细介绍,可以参考下面文章: https://rxxw-control.blog.csdn.net/article/details/128701050https://rxxw-control.blog.csdn.net/article/details/128701050三菱PLC限幅器 https://rxxw-control.blog.csdn.net/article/details/135212965