公布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网络库的使用.其设计与实现将有另文解说. 文件夹 由来 1 下载与编译 2 样例 2 基本结构 3 公开接口 4 内部实现 4 线程模型 5 结语 5 由来 半年前我写了一篇<学之者生,用之者死——ACE历史与简评>,当中提到“我心目中理想的网络库”的样子: 线程安全,支持多核多线程 不考虑可移植性…
最近一段时间阅读了muduo源码,读完的感受有一个感受就是有点乱.当然不是说代码乱,是我可能还没有完全消化和理解.为了更好的学习这个库,还是要来写一些东西促进一下. 我一边读一边尝试在一些地方改用c++11的新特性,这个工作持续在进行中.为啥这么干?没什么理由,纯粹是为了学习. 注:本文的大部分代码和图文都来自<Linux多线程服务端编程>,可直接参考muduo的源码,或者参考我这里抄着玩儿的版本. Reactor介绍 什么是Reactor? 换个名词"non-blocking IO…
Github 主页 https://github.com/panjf2000/gnet 欢迎大家围观~~,目前还在持续更新,感兴趣的话可以 star 一下暗中观察哦. 简介 gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库.这个库直接使用 epoll 和 kqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似于两个开源的网络库:libuv 和 libevent. 这个项目存在的价值是提供一个在网络包处理方面能和 Redis.Hap…
Stateless是一个基于C#创建状态机的简单库 .Net轻量状态机Stateless 很多业务系统开发中,不可避免的会出现状态变化,通常采用的情形可能是使用工作流去完成,但是对于简单场景下,用工作流有点大财小用感觉,比如订单业务中,订单状态的变更,涉及到的状态量不是很多,即使通过简单的if-else也能足够使用,甚至是用上switch去减少if-else的使用,都是可以的,尽管这会丧失某些东西.为更好的优化整个流程,此时会考虑到使用状态模式来解决一些问题. Stateless状态机GitHu…
背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但ACE毕竟有些臃肿.内部对象关系错综复杂,easy给人造成仅仅见树木不见森林的错觉. 所以打算用c++11开发一个较为简洁,高效,支持高并发的网络库. 开源         基础的结构已经开发完毕,代码也开源在github上.网址是 https://github.com/lichuan/fly 欢迎各…
RSuite http://rsuite.github.io RSuite 是一个基于 React.js 开发的 Web 组件库,参考 Bootstrap 设计,提供其中常用组件,支持响应式布局. 我们的目标就是让 WEB 开发更快捷,同时具有一定的灵活性和扩展性. 一个简单的例子: 通过 npm 安装 npm install rsuite CSS: 我们提供一些主题, 载入对应的 CSS 资源到你的页面中,同时你也可以直接引用 Bootstrap 的 CSS . Javascript: 比如在…
使用CSDN Code代码托管平台有一段时间了,今天新建立了一个公开的仓库https://code.csdn.net/smstong/learngit/tree/master,供大家測试合并请求等协作流程. 希望大家踊跃參与!…
import gevent def test1(): print 12 gevent.sleep(0) print 34 def test2(): print 56 gevent.sleep(0) print 78 gevent.joinall([ gevent.spawn(test1), gevent.spawn(test2), ]) 解释下,"gevent.spawn()"方法会创建一个新的greenlet协程对象,并运行它."gevent.joinall()"…
libtnet是一个用c++编写的高性能网络库,它在设计上面主要参考tornado,为服务端网络编程提供简洁而高效的接口,非常易于使用. Echo Server void onConnEvent(const ConnectionPtr_t& conn, ConnEvent event, const void* context) { switch(event) { case Conn_ReadEvent: { const StackBuffer* buffer = static_cast<co…
AgileRepository 这是一个可以帮助你快速开发Repository的lib.有点像SpringData JPA根据方法名.注解来自动生成查询方法的功能. 对于一些简单的查询,只需要定义接口就行了,实现都不用. Github: AgileRepository 依赖 AspectCore >= 0.2.4 Dapper >= 1.50.4 DapperExtensions >= 1.6.3 System.Threading.Tasks.Extensions >= 4.3.0…
muduo网络库的设计与实现 muduo是基于Reactor模式的C++网络库; Reactor的关键结构 Reactor最核心的是事件分发机制, 即将IO multiplexing拿到IO事件分发给各个文件描述符(fd)的事件处理函数; 每个Channel对象自始至终只负责一个文件描述符(fd)的IO事件分发, 但它并不拥有这个fd, 也不会在析构的时候关闭这个fd; TimerQueue定时器 用timerfd给EventLoop加上定时器功能(和处理IO事件相同的方式来处理定时), 这样的…
I/O模型选择 在网络服务端编程中,一个常见的情景是服务器需要判断多个已连接套接字是否可读,如果某个套接字可读,则读取该套接字数据,并进行进一步处理. 在最常用的阻塞式I/O模型中,我们对每个连接套接字通过轮流read系统调用获取可读数据.如图3-1所示,read系统调用将会把该线程阻塞,直到数据报到达且被复制到应用进程的缓冲区中时才会返回. 图3-1 阻塞式I/O模型 在阻塞式I/O模型中,数据可读和读取数据这两个操作被合并在了一个系统调用中,对于单个套接字是否可读的判断,必须要等到实际数据接…
线程类Thread是对POSIX线程的封装类,因为要构建的是一个Linux环境下的多线程网络库,对线程的封装是很必要的. 首先是CurrentThread命名空间,主要是获取以及缓存线程id: #ifndef CURRENTTHREAD_H #define CURRENTTHREAD_H #include <unistd.h> #include <sys/syscall.h> namespace CurrentThread { extern __thread int t_cache…
目录 介绍 使用 性能 实现 日志库 协程 协程调度 定时器 Hook RPC实现 项目地址:https://github.com/gatsbyd/melon 介绍 开发服务端程序的一个基本任务是处理并发连接,现在服务端网络编程处理并发连接主要有两种方式: 当"线程"很廉价时,一台机器上可以创建远高于CPU数目的"线程".这时一个线程只处理一个TCP连接,通常使用阻塞IO.例如Go goroutine.这里的"线程"由语言的runtime自行调度…
一.三种网络IO模型: 分类: BIO 同步的.阻塞式 IO NIO 同步的.非阻塞式 IO AIO 异步非阻塞式 IO 阻塞和同步的概念: 阻塞:若读写未完成,调用读写的线程一直等待 非阻塞:若读写未完成,调用读写的线程不用等待,可以处理其他工作 异步:读写过程完全托管给操作系统完成,操作系统完成后通知调用读写的线程 同步:读写过程由本线程完成,期间可以处理其他工作,但要轮询读写是否完毕 BIO 虽然可以使用线程池+等待队列进行优化,避免使用过多的线程,但是依然无法解决线程利用率低的问题. 数…
在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 View有紧密的耦合度,因为在Controller代码中夹杂了组件部份的名称!那么在这一篇我,我再改用Struts框架来构建这个系统,要注意的是,构建Struts应用程序时,一般不用自己去写中心控制器ActionServlet代码,因为ActionServlet是Struts框架的一个内置组件.但…
通过前边的一篇博文轻量级网络库libevent初探,我们知道libevent实际上是封装了不同操作系统下的/dev/poll.kqueue.event ports.select.poll和epoll事件机制,从而给我们提供一个统一的接口. libevent采用了Reactor I/O 设计模式,而Reactor是基于同步I/O机制的,所以libevent实际是一个基于同步I/O机制的库. 对于I/O设计模式,与Reactor相对应的还有Proactor.下边我们先来看下这两者的不同之处. Rea…
无论是C++还是Java编写的网络框架,大多数都是基于Reactor模式进行设计和开发,Reactor模式基于事件驱动,特别适合处理海量的I/O事件. 1. 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接: 2)作为NIO客户端,向服务端发起TCP连接: 3)读取通信对端的请求或者应答消息: 4)向通信对端发送消息请求或者应答消息. Reactor单线程模型示意图如下所示: 图1-1 R…
作者:dave@http://krondo.com/slow-poetry-and-the-apocalypse/  译者:杨晓伟(采用意译) 这个系列是从这里开始的,欢迎你再次来到这里来.现在我们可能要写一些代码.在开始之前,我们都做出一些必要的假设. 关于对你的假设 在展开讨论前,我假设你已经有过用Python写同步程序的经历并且至少知道一点有关Python的Sockt编程的经验.如果你从没有写过Socket程序,或许你可以去看看Socket模块的文档,尤其是后面的示例代码.如果你没有用过P…
Reactor是基于NIO中实现多路复用的一种模式. 什么是Reactor模式 同步的等待多个事件源到达(采用select()实现) 将事件多路分解以及分配相应的事件服务进行处理,这个分派采用server集中处理(dispatch) 分解的事件以及对应的事件服务应用从分派服务中分离出去(handler) 为什么使用Reactor模式 常见的网络服务中,如果每一个客户端都维持一个与登陆服务器的连接.那么服务器将维护多个和客户端的连接以出来和客户端的contnect .read.write ,特别是…
reactor中包含5个核心结构,那么从操作系统低层次的调度来看5部分是这样的. (1)Handle(句柄资源描述符)本质是对客户端连接上来以后发生事件的处理机制,比如连接成功,读取数据,发送数据等状态. (2)同步事件分离器,相对于nio来说可以理解为selector,对于客户端过来的事件需要一个一个的处理,根据事件的不同分发给具体不同的处理器. (3)initialize dispatch(初始事件分发器)实际为管理对象,所有的事件集合首先会达到这里,后面会通过select分发,包括后面的h…
原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于Reactor框架的服务器. 首先回顾下Reactor模式和Preactor模式. Reactor模式: Reactor模式实现非常简单,使用同步IO模型,即业务线程处理数据需要主动等待或询问,主要特点是利用epoll监听listen描述符是否有响应,及时将客户连接信息放于一个队列,epoll和队列…
该文章总结了网上资源对这两种模式的描述 原文地址:http://www.cnblogs.com/dawen/archive/2011/05/18/2050358.html 1.标准定义 两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer).分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler).开发人员预先注册需要处理的事件及其事件…
上个月看了朋友推荐的mudo网络库,下完代码得知是国内同行的开源作品,甚是敬佩.下了mudo使用手冊和035版的代码看了下结构,感觉是一个比較成熟并且方便使用的网络库.本人手头也有自己的网络库,尽管不敢说是一个多强大的网络库,但毕竟在外网也稳定运营了几年,多组同一时候在线也跑过30w左右,单组server也能跑上w人.做游戏server几年的经验,感觉稳定性才是网游server最核心最重要的环节,效率还在其次,这也是眼下网游server普遍採用分组架构决定的,从运营的角度来看,有时候一组serv…
muduo网络库简介 高级语言(Java, Python等)的Sockects库并没有对Sockects API提供更高层的封装, 直接用它编写程序很容易掉到陷阱中: 网络库的价值还在于能方便地处理并发链接; 网络核心库 muduo是基于Reactor模式的网络库, 其核心是个事件循环EventLoop,用于响应计时器和IO事件; muduo采用基于对象(object-based)而非面向对象(object-oriented)的设计风格; 网络附属库 网络库有一些附属模块, 它们不是核心内容,…
多线程服务器的适用场合与常用编程模型 进程间通信与线程同步; 以最简单规范的方式开发功能正确.线程安全的多线程程序; 多线程服务器是指运行在linux操作系统上的独占式网络应用程序; 不考虑分布式存储, 只考虑分布式计算; 进程与线程 进程(process)是操作系统里最重要的两个概念之一(另一个是文件), 粗略的讲, 一个进程是"内存中正在运行的程序"; 每个进程有自己独立的地址空间(adress space), "在同一个进程"还是"不在同一个进程&q…
前言 muduo库是陈硕个人开发的tcp网络编程库,支持Reactor模型,推荐大家阅读陈硕写的<Linux多线程服务端编程:使用muduo C++网络库>.本人前段时间出于个人学习.找工作的目的用C++11重构了muduo库中核心的Reactor架构.这篇博文对muduo库中的Multi-Reactor架构代码进行逻辑梳理,同时认真剖析了作者每一处精妙的代码设计思想.目前我只重构并剖析了muduo库中的核心部分,即Multi-Reactor架构部分,具体细分有以下几个模块: 网络相关模块:如…
https://mp.weixin.qq.com/s/wSaJYg-HqnYY4SdLA2Zzaw RPC 框架作为研发体系中重要的一环,承载了几乎所有的服务流量.本文将简单介绍字节跳动自研网络库 netpoll 的设计及实践:以及我们实际遇到的问题和解决思路,希望能为大家提供一些参考. 前言 字节跳动框架组主要负责公司内 RPC 框架的开发与维护.RPC 框架作为研发体系中重要的一环,承载了几乎所有的服务流量.随着公司内 Go 语言使用越来越广,业务对框架的要求越来越高,而 Go 原生 net…
进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程.多线程.协程和异步. 多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库 多线程编程python中有Thread和threading 异步编程在linux下主+要有三种实现select,poll,epoll 协程在python中通常会说到yield,关于协程的库主要有greenlet,stackless,gevent,eventlet等实现. 进程 不共享任何状态 调度由操作系…
Joynet 项目地址:https://github.com/IronsDu/Joynet 介绍 high performance network library for lua, based on https://github.com/IronsDu/accumulation-dev and lua coroutine. Joynet 的网络底层使用多线程,但Lua (层面)是运行在单线程上. 借助协程提供同步形式的API.(同步的socket api,同步的http api,同步的redis…