ZLMediaKit中的线程

EventLoop的线程模型

服务器通用的IO模型event-loop + 非阻塞IO。线程模型可以是单线程,可以是多线程。对于已经普及了的多核环境,通常都是采用多线程。

通常一个线程中有一个EventLoop,比如accept是一个专门线程,accept后的fd分到不同线程中,一个fd只会在一个EventLoop中处理。那么也可以说是一个EventLoop就代表了一个线程。在ZLMediaKit中线程就是这种抽象。

EventLoop的基本实现就是IO多路复用(select,epoll等)+消息队列,它不止可以用于处理IO。也可以当作消息队列或定时器使用。

这种方式非常适用于对线程职责的划分,将特定的业务通过消息队列分到固定的线程。在webrtc中,rtc::thread也是种实现。它同时作为网络线程,信令线程,工作线程使用。其中工作线程并没有IO功能。 详细见webrtc中的rtc::thread

ZLMediaKit中的EventLoop

线程

EventLoop在众多的开源网络库都有实现。ZLMediaKit的实现非常适合用于多线程模型。

企业微信截图_17014217474387.png

以上为其类图,EventPoller就是EventLoop,为一个事件循环。它继承自TaskExecutor,代表了一个线程。

其中的方法asyncsync分别代表着向线程投递异步任务同步任务(在TaskExecutorInterface中定义)。它还包括了计算CPU负载的功能(在ThreadLoadCounter中定义)。

所以EventPoller是一个功能相当完备的线程:

  • 有事件循环
  • 可以向其投递任务。
  • 可以计算CPU负载,结合线程池一起使用,选取负载低的线程。

线程池

企业微信截图_1701421705841.png

以上为ZLMediaKit中线程池类图,通过EventPollerPoollgetPollergetFirstPoller方法来取一个线程(EventPoller)。getPoller优先取一个CPU负载小的线程。

使用

产生一个线程

在ZLMediaKit中通过EventPollerPool来获取一个EventPoller,如下代码:

EventPollerPool::setPoolSize(thread_num);
auto poller = EventPollerPool::Instance().getPoller();

EventPollerPool::setPoolSize(thread_num)设置线程数,当产生线程池对象EventPollerPool时,线程都已创建并绑定到了核上,通过getPoller()方法获取一个CPU负责最小的线程。上面的poller对象就代表了一个线程。

向线程投递一个任务

通过async,比如如下代码:

poller->async([invoker,contentOut](){
                HttpSession::KeyValue headerOut;
                //你可以自定义header,如果跟默认header重名,则会覆盖之
                //默认header有:Server,Connection,Date,Content-Type,Content-Length
                //请勿覆盖Connection、Content-Length键
                //键名覆盖时不区分大小写
                headerOut["TestHeader"] = "HeaderValue";
                invoker(200,headerOut,contentOut);
            });

通过doDelayTask向线程投递定时任务,如下代码:

poller->doDelayTask((uint64_t) (second * 1000), [cb, second]() {
        try {
            if (cb()) {
                //重复的任务
                return (uint64_t) (1000 * second);
            }
            //该任务不再重复
            return (uint64_t) 0;
        } catch (std::exception &ex) {
            ErrorL << "Exception occurred when do timer task: " << ex.what();
            return (uint64_t) (1000 * second);
        }
    });

瑕疵

  • EventPoller的构造函数都被设置为了私有,只能通过EventPollerPool::Instance().getPoller()获取,这有些不方便。在一些场景,程序会被划分成了固定的线程,而不需要使用线程池。
  • 如果能提供将当前线程保证成EventPoller线程的功能就更好了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AJAX原理解析与案例实践,助你成为前端技术高手

大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

微信开发者工具安装教程

文章目录 下载安装包执行安装包 #微信开发者工具安装教程 下载安装包 官网网址 执行安装包 D:\Program Files (x86)\Tencent\微信web开发者工具\dll

D92-02-ASEMI快恢复二极管20A 200V

编辑&#xff1a;ll D92-02-ASEMI快恢复二极管20A 200V 型号&#xff1a;D92-02 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 特性&#xff1a;插件、快恢复二极管 最大平均正向电流&#xff1a;20A 最大重复峰值反向电压&#xff1a;200V 恢复时间&#xff1a;35ns…

nodejs使用express框架启动服务操作mysql数据库

描述: 首先在本地搭建mysql数据库,配置:host: ‘192.168.3.249’,user: ‘mkx’,password: ‘123456’,database: ‘gg’.测试连接正常.使用express写两个接口, 1.查询所有学生的接口,使用的get请求,无参数. 2.插入一条学生信息,使用post请求,body是一个json的学生信息{name:“…

计算机组成原理——存储器21-40

21、存储器存取周期是指&#xff08;C&#xff09; A、存储器的读出时间 B、存储器的写入时间 C、存储器进行连续读或写操作所允许的最短时间间隔 D、存储器进行一次读或写操作所需的平均时间 存取周期是存储器进行连续读或写操作所允许的最短时间间隔 存取时间是存储器进行一次…

【面试】数据库—优化—聚簇索引和非聚簇索引、回表查询

数据库—优化—聚簇索引和非聚簇索引、回表查询 1. 什么是聚簇索引什么是非聚簇索引 ? 聚集索引选取规则: 如果存在主键&#xff0c;主键索引就是聚集索引&#xff1b;如果不存在主键&#xff0c;将使用第一个唯一&#xff08;UNIQUE&#xff09;索引作为聚集索引&#xff1b…

Geek challenge 2023 EzHttp

打开链接需要使用post请求提交username和password 查看源码得到提示&#xff0c;爬虫想到robots协议 访问robots.txt 访问得到的路径&#xff1a;/o2takuXXs_username_and_password.txt 拿到用户名和密码&#xff1a; username:admin password:dm1N123456r00t# 进行post传参…

Windows 和 MacOS 上安装配置ADB(安卓调试桥)

一、Android 调试桥 (ADB) Android 调试桥&#xff08;ADB&#xff09; 是一款多功能命令行工具&#xff0c;它让你能够更便捷地访问和管理 Android 设备。使用 ADB 命令&#xff0c;你可以轻松执行以下操作 在设备上安装、复制和删除文件&#xff1b;安装应用程序&#xff1…

HTTP与HTTTPS的区别

目录 一、HTTP和HTTTPS的概念 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff1a; HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;&#xff1a; 二、HTTP 的 get 请求和 post 请求的区别&#xff1f; 三、HTTPS 的工作原理&#xff…

07.CSS常用样式

CSS常用样式 1.颜色样式 颜色名 介绍 直接使用颜色对应的英文单词&#xff0c;编写比较简单 具体颜色名参考 MDN 官方文档 例子 p {color:red; }缺点 颜色名这种方式&#xff0c;表达的颜色比较单一&#xff0c;所以用的并不多 rgb或rgba 介绍 使用 红、黄、蓝 这三…

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

水闸水雨情监测设施建设项目

功能设计 在水闸上、下游挡墙外侧各安装1套雷达水位计&#xff0c;水闸屋顶布置个雨量计&#xff0c;水位及雨量监测数据的采集与传输主要是实时的完成水位、雨量数据的采集与处理&#xff0c;并按照设定的工作方式、时间间隔、增量范围将数据上传至扬压力监测站边缘计算终端&…

EasyExcel实现⭐️本地excel数据解析并保存到数据库的脚本编写,附案例实现

目录 前言 一、 EasyExcel 简介 二、实战分析 1.Controller控制层 2. service方法和方法实现 3.EasyExcel相关类 3.1 excel表实体类 3.2 自定义监听器类 4.测试 4.1 准备工作 4.2 断点调试 5.生成脚本文件 三、分析总结 章末 小伙伴们大家好&#xff0c;最近开发的时…

微服务最佳实践:构建可扩展且高效的系统

微服务架构彻底改变了现代软件开发&#xff0c;提供了无与伦比的敏捷性、可扩展性和可维护性。然而&#xff0c;有效实施微服务需要深入了解最佳实践&#xff0c;以充分发挥微服务的潜力&#xff0c;同时避免常见的陷阱。在这份综合指南中&#xff0c;我们将深入研究微服务的关…

getchar的功能和用法

getchar()是C语言中的一个标准库函数&#xff0c;用于从标准输入&#xff08;通常是键盘&#xff09;读取一个字符&#xff0c;并将其作为int类型返回。它通常用于从键盘获取用户输入。 getchar()函数在程序中等待用户输入&#xff0c;当用户输入一个字符并按下回车键后&#…

【抄作业】ubuntu完全卸载CUDA,彻底卸载cuda,卸载不同版本的cuda,cuda不同版本的卸载方法

卸载的实现方法 如何正确、完全的卸载cuda呢&#xff1f; 其实cuda安装时就已经准备好了卸载的接口&#xff0c;卸载程序在/usr/local/cuda-xx.x/bin下&#xff0c;需要注意的是cuda10.0及之前的版本卸载程序名为uninstall_cuda_xx.x.pl&#xff0c;而cuda10.1及之后的版本卸…

【玩转 TableAgent数据智能分析】-数据分析师的大模型

【玩转 TableAgent数据智能分析】-数据分析师的大模型 九章云极DataCanvas介绍TableAgent的新手入门指南&#xff1a;官网首页立刻体验问题测试问题1&#xff1a;问题2&#xff1a;问题3&#xff1a;问题4&#xff1a;问题5&#xff1a; 通用大模型对比分析对csv数据集的支持比…

【游戏篇】Scratch之小猴子接水果

【作品展示】小猴子接水果 操作&#xff1a;点击小绿旗&#xff0c;按下键盘左右键控制小猴子移动拿到水果&#xff0c;同时也要躲避炸弹。

Windows汇编调用printf

VS2022 汇编 项目右键 生成依赖项 生成自定义 勾选masm 链接器 高级 入口点 main X86 .686 .model flat,stdcall option casemap:none includelib ucrt.lib includelib legacy_stdio_definitions.libEXTERN printf:proc.data szFormat db %s,0 szStr db hello,0.code main…

Python Socket编程

Python Socket编程 文章目录 Python Socket编程1. 弄懂HTTP、Socket、TCP这几个概念五层网络模型 2. client和server实现通信Socket编程模式指南代码实现 3. socket实现聊天和多用户连接4. socket模拟http请求 1. 弄懂HTTP、Socket、TCP这几个概念 整个计算机网络都是有协议组…