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

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

当你看到这篇文章时,想必你对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);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【redis】hiredis-vip (hiredis封装成支持cluster的api)
  • 【知识】IPxx防水等级 说明
  • 【安全】哈希(hash)算法可以防止数据被篡改的原理是什么
  • 【数据库】时序数据库InfluxDB 性能测试和为什么时序数据库更快、时序数据库应用场景...
  • 【安全编码】代码质量|C语言安全编码---增加中
  • python的静态变量和静态方法
  • 【C++】libevent 、libev、 libuv 、asio、 muduo、 ace 等C++ 网络库
  • 【工具】Fiddler HTTP 抓包工具使用教程
  • 【测试】Cunit单元测试
  • 【VS linux】使用Visual Studio 2017开发Linux程序
  • 【MQTT】python MQTT客户端
  • 【STL】STL 操作
  • 【FTP】Linux中ftp的常用命令
  • 【HTTP】Linux命令行访问网页
  • 【libevent】libevent 库的使用(windows) ---编辑中
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CSS相对定位
  • idea + plantuml 画流程图
  • Invalidate和postInvalidate的区别
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • java 多线程基础, 我觉得还是有必要看看的
  • JS专题之继承
  • oschina
  • OSS Web直传 (文件图片)
  • php中curl和soap方式请求服务超时问题
  • Sublime text 3 3103 注册码
  • tab.js分享及浏览器兼容性问题汇总
  • Vue全家桶实现一个Web App
  • Vue实战(四)登录/注册页的实现
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 搞机器学习要哪些技能
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 警报:线上事故之CountDownLatch的威力
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 看域名解析域名安全对SEO的影响
  • 前嗅ForeSpider采集配置界面介绍
  • 深入浅出Node.js
  • 微信小程序填坑清单
  • 一、python与pycharm的安装
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 【干货分享】dos命令大全
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (145)光线追踪距离场柔和阴影
  • (9)STL算法之逆转旋转
  • (MATLAB)第五章-矩阵运算
  • (ros//EnvironmentVariables)ros环境变量
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (推荐)叮当——中文语音对话机器人
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (转)用.Net的File控件上传文件的解决方案