【libevent 】libevent 多线程实现高并发

2023-10-26

当你看到这篇文章时,想必你对libevent已经有了足够的了解,笔者在此就不多做描述了,直接进入正题。

1.起因

最近在做Redis中间件,目标实现集群管理、分布式数据处理、高性能。由于在某些情况下,单个节点的Redis性能可能无法满足需求,并且单个机器的内存大小是受限制的。如果采用中间件的方式管理多个Redis实例,不仅可以避免单点机器内存不够用的情况,也能使性能得到大幅提升。经过Redis中间件数据分片后,各个Redis实例可以同时处理读写请求,所以比单线程的Redis实例要快很多。在这里,中间件起到数据转发及管理的功能,特别是数据转发这一块,对中间件的处理能力要求比较高,在高并发情况下也能保证数据正常处理,不能影响业务使用。

2.实现

要实现高性能的服务端网络程序,基本上是异步处理网络IO+多线程。关于异步处理网络IO,网络上现成的库有很多,如果你喜欢动手,自己封装也行。不过我还是建议大家使用已经造好的、成熟稳定的轮子。在这里我比较推荐使用libevent,这个库相对来说比较成熟,使用起来也简单。

3.架构图

在这个架构模型中,我们开启了N个线程,每个线程中包含一个event_base对象,他们都是在自己的线程中工作。何时派发工作给这些工作线程,则由一个专门的AcceptThread线程来完成。这个线程负责接受客户端的连接,接受成功后会将该连接分配给工作线程。在这里我们采用均衡分配的方式,让每个线程处理的连接数是趋于相等的。

4.代码流程

首先要让libevent支持多线程,需要加上一段代码,这段代码只需要执行一次

#ifdef WIN32
        evthread_use_windows_threads();
#else
        evthread_use_pthreads();
#endif


第一步:创建一个WorkThread线程池,每个线程对象中包含一个event_base对象,由于没有事件的话event_dispatch函数会退出,我们可以在里面注册一个永久的定时器事件,这样每个工作进程就不会退出。这个时候的状态是:等待外部给这个工作线程添加事件。

第二步:主线程监听端口,接受客户端连接。每到来一个连接就形成一个ConnectContext的结构,然后分配到一个工作线程去完成读写操作。这个过程不需要我们去加锁,libevent内部已经完成了这个操作。我们只需要在AcceptThread中派发任务给工作线程就可以了。

第三步:没了,按照这个架构,大部分代码就是写处理数据的代码了。

原文链接:https://blog.csdn.net/loydia/article/details/78683558

 

libevent框架:

 

1、创建 event_base

2、创建 事件event -->常规事件/带缓冲的事件

3、将事件 添加到base上

4、循环监听事件满足

5、释放 base

 

1、struct event_base *base = event_base_new();

2、event_new()/buffevent_socket_new();

3、event_add(struct event_base *base);

4、event_base_disptch(base);

5、event_base_free(base);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【libevent 】libevent 多线程实现高并发 的相关文章

  • Bi的ETL中怎么做增量处理

    增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据 在ETL使用过程中 增量抽取较全量抽取应用更广 如何捕获变化的数据是增量抽取的关键 对捕获方法一般有两点要求 准确性 能够将业务系统中的变化数据按一定的频率准确地捕
  • ESP32 使用 Arduino 实现 OTA 更新

    在本指南中 您将学习如何使用库对 ESP32 开发板进行无线 OTA 更新 该库创建了一个网络服务器 允许您将新固件 新 sketch 上传到您的电路板 而无需在 ESP32 和您的计算机之间建立串行连接 此外 使用此库 您还可以将新文件上
  • Weex简介和环境的安装——Weex的学习之路(一)

    Weex 致力于使开发者能基于通用跨平台的 Web 开发语言和开发经验 来构建 Android iOS 和 Web 应用 简单来说 在集成了 WeexSDK 之后 你可以使用 JavaScript 语言和前端开发经验来开发移动应用 也就是说
  • 计算机网络总结篇-我们是怎么访问百度的?

    对于计算机网络的理解 我的理解便是从生活中剥削出的知识体系 但这个不能用生活完全的去理解 毕竟编程思维跟生活区别还是很大的 但是生活中的例子能让我们先理解一个大概 比如我说一个例子 我的同学 谭某 他这个人比较的贱 有很多仇家 有一天仇家a
  • 华为交换机关闭接口命令_华为交换机常用命令及技巧

    如果这篇文章对您有帮助 请关注并点赞 感谢您的支持 如果还有其他问题 请私信给我 前几期讲解了华为交换机的一些配置 今天讲解一些简单的命令和一些技巧 主要是显示华为交换机配置的一些命令 这些命令对于网络管理很有帮助 也是华为交换机的常用命令
  • java无法找到加载主类是什么意思,在Java程序运行时遇到的“Could not find or load main class(无法找到或者加载主类)”是什么意思?...

    其中是命令行选项 以 字符开头 是包含包名称的完整类名 是任意传递到应用程序的命令行参数 1 有一个名为 executable 的JAR文件的并不使用这种语法 稍后我将在底部对其进行描述 包含包名称的完整类名通常写成你在Java源代码中 你
  • [Qt]Qt(C++开发框架)下载安装

    Qt开发环境安装教程 Qt官方下载网址
  • 王者荣耀助手动态服务器维护中,王者荣耀助手动态怎么发不了

    发布时间 2015 11 20 王者荣耀助手礼包怎么领取 助手礼包领取地址是什么 下面来看看王者荣耀助手礼包怎么领取 助手礼包领取地址一览吧 希望能对大家有所帮助 蚕豆网王者荣耀开黑群 439442380 点击加入 亲爱的召唤师 安卓版 l
  • springboot -- 微服务 - 3.Eureka注册中心

    三 Eureka注册中心 3 1 作用 在Eureka架构中 微服务角色有两类 EurekaServer 服务端 注册中心 记录服务信息 心跳监控 EurekaClient 客户端 Provider 服务提供者 例如案例中的user ser
  • docker启动出现Error response from daemon: Cannot restart container的报错

    1 发现问题 突然发现启动 重启 容器的时候报这个错 Error response from daemon Cannot restart container 容器id driver failed programming external c
  • Spark自学之路(十三)——Spark 机器学习库

    Spark 机器学习库MLlib Spark提供了一个基于海量数据的机器学习库 它提供了常用机器学习算法的分布式实现 开发者只需要有 Spark 基础并且了解机器学习算法的原理 以及方法相关参数的含义 就可以轻松的通过调用相应的 API 来
  • LeetCode力扣刷题:27.移除元素

    第一版 还没领悟到双指针的内核 void swap int a int b int temp a a b b temp int removeElement int nums int numsSize int val int len nums
  • php三层架构erp,基于ERP/MES/PCS三层架构的现代集成制造系统模型

    数据集成是实施MES的基础将生产管理层的生产运行 产品质量 原料和产品输送 动力能耗等数据进行汇总和处理 使下层生产过程的实时信息和上层企业资源管理等的各类信息都在MES层中融合 并通过信息集成形成优化控制 优化调度和优化决策等调度或指令
  • 【电路】自用人体感应灯(HC-SR501人体感应模块)

    文章目录 低成本人体感应灯 需求分析 器件清单 参数测量 HC SR501人体感应模块 LED灯板 方案设计 思路简介 原理图 PCB设计 成品 低成本人体感应灯 需求分析 老旧小区地下室没有灯 找钥匙不方便 地理环境因素使用声音传感灯易发
  • 五年后端研发,跳槽薪资30k变成45k,总结的这些面试题,你会哪些

    每年的金三银四都是各大公司招聘程序员的最佳时期 在这段时间内有好多程序员会为了面试而发愁 不知道如何才能收到好的offer 拿到理想的薪资 实现自我的人生价值 我想告诉大家的是 其实都不用愁的 好好准备一下就可以了 每个人都想找一份大厂的
  • linux服务器安装jdk,maven详细步骤

    linux服务器安装jdk maven以及nginx详细步骤 一 安装jdk 使用命令安装 二 安装maven 1 将下载好的maven包放入linux下自定义文件夹 2 配置maven环境 打开profile文件 命令如下 一 安装jdk
  • C语言是用( )符号来标注字符常量,C语言符号常量的常考点

    各位计算机考研的小伙伴们 大家好 很开心以这样的方式和大家分享计算机考研的相关知识 今天给大家带来的内容是考研 C语言程序设计 中符号常量的常见考法 符号常量是用一个标识符来表示一个常量 特点是编译后写在代码区 不可寻址 不可更改 属于指令
  • stm32HAL库 G4 SPI 从机DMA可变长度接受数据乱码问题

    使用一个引脚当作SPI CS 边沿触发 在电平位0时候接受SPI数据20个字节 如果实际主机只发了小于20字节时候 下一个帧就会错乱 去老外找了之后 需要复位SPi RCC时钟才能复位掉SPI 下面的不行 正确的做法
  • 《剑指offer》系列---1

    最近一直在看剑指offer 这上面的题目都是比较考察编程能力的 打算做个记录 把写过的代码保存下来 1 实现一个string类 面试官的考察点应该在以下几点 1 模板类的书写 2 对于赋值函数考察的几点 1 是否返回引用 因为只有返回引用
  • 《面向对象程序设计C++》期末考试试卷

    面向对象程序设计C 期末考试试卷 一 选择题 每小题3分 共48分 01 下列关于C 函数的叙述中 正确的是 C A 每个函数至少要具有一个参数 B 每个函数都必须返回一个值 C 函数在被调用之前必须先声明 D 函数不能自己调用自己 02

随机推荐