发布一个基于 Reactor 模式的 C++ 网络库

441 views
Skip to first unread message

Shuo Chen

unread,
Aug 31, 2010, 11:35:49 PM8/31/10
to TopLanguage
Muduo 是我在业余时间编写的基于 Reactor 模式的 C++ 网络库,适用于 Linux 平台,支持多线程。
半年前我写了一篇《学之者生,用之者死——ACE历史与简评》,其中提到“我心目中理想的网络库”的样子:

* 线程安全,支持多核多线程
* 不考虑可移植性,不跨平台,只支持 Linux,不支持 Windows。
* IO multiplexing 使用 poll 和 epoll。 (poll 是为了在开发库本身时便于调试 IO 事件)
* 主要支持 x86-64,兼顾 IA32
* 不支持 UDP,只支持 TCP
* 不支持 IPv6,只支持 IPv4
* 不考虑广域网应用,只考虑局域网
* 只支持一种使用模式:non-blocking IO + one event loop per thread,不考虑阻塞 IO
* API 简单易用,只暴露具体类和标准库里的类,不使用 non-trivial templates,也不使用虚函数
* 只满足常用需求的 90%,不面面俱到,必要的时候以 app 来适应 lib
* 只做 library,不做成 framework
* 争取全部代码在 5000 行以内(不含测试)

muduo 的主体内容在 5 月底已经基本完成,现在我把它开源。

从架构上讲,muduo 没有多少新意,它就是一个 IO 多路复用的事件处理库,熟悉 reactor 模式的人一看就明白。
在实用上,我还没有用它实现复杂的应用(我有一些打算,比如实现 protobuf-rpc)。
这个库也没有以高并发高吞吐为目标,它的目标是清晰简洁,容易理解并使用,且性能过得去 (并发数达到 50k)。
在细节上,我花了比较多的精力从设计上保证事件回调的安全,不会提前释放对象,也不会有泄漏,而且做到线程安全。

更多的介绍(包括对象生命期的设定)与下载方式见: http://blog.csdn.net/Solstice/archive/2010/08/29/5848547.aspx

woo

unread,
Sep 1, 2010, 12:08:02 AM9/1/10
to pon...@googlegroups.com
我觉得,你可以考虑看看libevent

Linker M Lin

unread,
Sep 1, 2010, 1:25:38 AM9/1/10
to TopLanguage
我希望楼主能给出 重新造一个轮子的理由以及和 libevent libev asio等对比后的优势。

On Sep 1, 12:08 pm, woo <woosi...@gmail.com> wrote:
> 我觉得,你可以考虑看看libevent
> On 20:35 Tue 31 Aug , Shuo Chen wrote:
>
> > Muduo 是我在业余时间编写的基于 Reactor 模式的 C++ 网络库,适用于 Linux 平台,支持多线程。

> > 半年前我写了一篇《学之者生,用之者死----ACE历史与简评》,其中提到"我心目中理想的网络库"的样子:

kelviN

unread,
Sep 1, 2010, 1:29:23 AM9/1/10
to TopLanguage
我想问LZ是不是翻译CC2的那位?

On Sep 1, 11:35 am, Shuo Chen <giantc...@gmail.com> wrote:
> Muduo 是我在业余时间编写的基于 Reactor 模式的 C++ 网络库,适用于 Linux 平台,支持多线程。

> 半年前我写了一篇《学之者生,用之者死----ACE历史与简评》,其中提到"我心目中理想的网络库"的样子:

qiaojie

unread,
Sep 1, 2010, 2:13:08 AM9/1/10
to pon...@googlegroups.com
我倒是想听听楼主对于做出这些选择背后的理由是什么?

Shuo Chen

unread,
Sep 1, 2010, 2:30:22 AM9/1/10
to TopLanguage
libevent 是一个非常好用的 C 语言网络库(有 3 万多行代码),我甚至给它提交过 feature patch,也被接纳进了最新的
2.0.6 中。
libev 不是一个完整的网路库,它功能主要是提供一个高效的 IO 事件循环,如果用它来编写网络程序的话需要自己补充写很多代码。
asio 是基于 proactor 模式的 C++ 网络库(主体部分有 4 万多行代码),如果你喜欢 proactor 风格,那么用它也挺
好。
这三个库都是跨平台的,因此增加了不少复杂性。

muduo 试图把 libevent 的便利性带到 C++ 语言中,并利用 C++ 语言的特性来简化网络开发(特别是资源管理这块)。
在编写 muduo 时,我尝试过用 C++ 封装 libevent ,但是感觉用起来没有自己写的库那么顺手。

Shuo Chen

unread,
Sep 1, 2010, 2:30:58 AM9/1/10
to TopLanguage
第三译者。

Shuo Chen

unread,
Sep 1, 2010, 2:47:30 AM9/1/10
to TopLanguage
简单地说,是适应我自己的需求。正如 http://code.google.com/p/muduo/ 所列,我的意图并不是写一个通用的网络库,而
是为方便我在家编写分布式程序(eg. 不需要支持 Windows/IPv6)。
为此,我需要一个用着顺手且靠得住的网络库作为平台,于是就有了 muduo。

HaoPeiQiang

unread,
Sep 1, 2010, 2:50:40 AM9/1/10
to pon...@googlegroups.com
最近在家写了什么好玩东西了么?

2010/9/1 Shuo Chen <gian...@gmail.com>



--
Tinyfool的开发日记 http://www.tinydust.net/dev/
代码中国网 http://www.codechina.org
myTwitter: http://twitter.com/tinyfool

jinhu wang

unread,
Sep 1, 2010, 2:49:06 AM9/1/10
to pon...@googlegroups.com
muduo的名字是怎么来的?

HaoPeiQiang

unread,
Sep 1, 2010, 2:55:12 AM9/1/10
to pon...@googlegroups.com
我也很好奇这个

2010/9/1 jinhu wang <wangji...@gmail.com>

Shuo Chen

unread,
Sep 1, 2010, 2:59:06 AM9/1/10
to TopLanguage
敝校校徽。

On Sep 1, 2:55 pm, HaoPeiQiang <HaoPeiQi...@gmail.com> wrote:
> 我也很好奇这个
>
> 2010/9/1 jinhu wang <wangjinhu...@gmail.com>
>
>
>
>
>
> > muduo的名字是怎么来的?
>
> > 在 2010年9月1日 下午2:47,Shuo Chen <giantc...@gmail.com>写道:
>
> > 简单地说,是适应我自己的需求。正如http://code.google.com/p/muduo/所列,我的意图并不是写一个通用的网络库,而

jinhu wang

unread,
Sep 2, 2010, 12:47:09 AM9/2/10
to pon...@googlegroups.com
写的挺好的,但还是framework。

jinhu wang

unread,
Sep 2, 2010, 12:59:06 AM9/2/10
to pon...@googlegroups.com
framework跟library的界线是由应用者站的角度来决定的,
我的感觉是:每次看到一个新概念都会先头大半天,概念的叠加提高了学习的门槛,对于我来说,这个库还是复杂了些。
不过从自用的角度出发,应该是一个很好的东西。

jigsaw

unread,
Sep 2, 2010, 1:15:09 PM9/2/10
to pon...@googlegroups.com
下载代码翻了翻。有如下感觉:

1 中规中矩
常见的eventloop,正如作者自己说的,没新意

2 缺乏严谨性
缺少对signal的处理;log和出错处理属于toy级别

3 性能低下
浪费性能的操作随处可见

4 对读者没有学习价值
包装层太薄,薄到多此一举的地步;对boost依赖太强;无论是性能方面还是架构方面都没有参考价值

5 除了作者本人,估计没人会使用在自己的项目/产品中

另外,作者特意说对32位平台只是兼顾,我还真没看出来对64位平台做了哪些优化,或者有哪些依赖64位平台的操作。

喝了点酒,费话两句,作者海涵。



2010/9/2 jinhu wang <wangji...@gmail.com>

sagasw

unread,
Sep 2, 2010, 8:25:58 PM9/2/10
to pon...@googlegroups.com
对于“3 性能低下 浪费性能的操作随处可见”能否做一些更详细的说明?
不做profiling就可以知道哪个地方一定会浪费?

------------------------------------------
blog: http://sunxiunan.com/
C++, Lua, living in Dalian
http://twitter.com/sagasw
------------------------------------------

2010/9/3 jigsaw <jig...@gmail.com>:

jinhu wang

unread,
Sep 2, 2010, 10:57:29 PM9/2/10
to pon...@googlegroups.com
偏激!
我觉得学习价值还是有的。
缺点是上下文依赖太多。

bronco

unread,
Sep 3, 2010, 3:47:00 AM9/3/10
to pon...@googlegroups.com
无聊!

jinhu wang

unread,
Sep 3, 2010, 3:54:06 AM9/3/10
to pon...@googlegroups.com
无从何来?

在 2010年9月3日 下午3:47,bronco <renfe...@gmail.com>写道:
无聊!

Hongzhang Liu

unread,
Sep 4, 2010, 4:12:52 AM9/4/10
to pon...@googlegroups.com
天将以夫子为木铎

野心很大啊

2010/9/1 jinhu wang <wangji...@gmail.com>

Shuo Chen

unread,
Sep 4, 2010, 4:35:26 AM9/4/10
to TopLanguage
出乎我的意料,ping pong 测试表明,muduo 吞吐量比 boost.asio 高 15% 以上。

http://blog.csdn.net/Solstice/archive/2010/09/04/5863411.aspx

On Sep 1, 11:35 am, Shuo Chen <giantc...@gmail.com> wrote:

> Muduo 是我在业余时间编写的基于 Reactor 模式的 C++ 网络库,适用于 Linux 平台,支持多线程。

> 半年前我写了一篇《学之者生,用之者死----ACE历史与简评》,其中提到"我心目中理想的网络库"的样子:

Shuo Chen

unread,
Sep 4, 2010, 8:36:52 AM9/4/10
to TopLanguage
也可以讲作"魔都",以纪念发源地。

On Sep 4, 4:12 pm, Hongzhang Liu <hongzhang....@gmail.com> wrote:
> 天将以夫子为木铎
>
> 野心很大啊
>

> 2010/9/1 jinhu wang <wangjinhu...@gmail.com>
>
>
>
> > muduo的名字是怎么来的?
>


> > 在 2010年9月1日 下午2:47,Shuo Chen <giantc...@gmail.com>写道:
>

> > 简单地说,是适应我自己的需求。正如http://code.google.com/p/muduo/所列,我的意图并不是写一个通用的网络库,而

jigsaw

unread,
Sep 4, 2010, 4:00:50 PM9/4/10
to TopLanguage
从来没用过boost asio,也从来没看过任何人跟boost asio比快的, 也许是因为boost asio快到任何人都望尘莫及吧 -
___-
用cpp写这种体积小而运行速度快产品没有优势。要简单的话有perl,要快的话有c。
而且这种基于poll的产品,既要尽量快,又要尽量少占cpu。因为poll很容易写成很占cpu的loop。如果持续占用超过5%的cpu,那肯定是
没法实际使用的,除非你的应用是跑10Gbps的。
你写个最简单的tcp发送接收试试看,一个线程就够,死循环发送和接收,很轻松跑满1G的网卡,吞吐量肯定也比asio大,cpu也一直99%,但是这
样做有意义吗?

qiaojie

unread,
Sep 5, 2010, 2:45:46 AM9/5/10
to pon...@googlegroups.com
这位老兄,没做过测试就不要乱下结论,你怎么知道他的程序CPU占用率就比asio高很多了?
而且你的话也很矛盾,一会说“asio快到任何人都望尘莫及”,一会又说“cpp速度没c快”,那你告诉我asio用什么开发的?
 
当然我也觉得楼主的测试有些草率和不严谨,首先不应该在同一台机器上测试,本机测试的话TCP并不通过网卡,而是直接在内存里通讯了,这样不可能准确的得到IO吞吐量,其次应该补充一下两个测试中所用的IO模型,以及对瓶颈的分析。

2010/9/5 jigsaw <jig...@gmail.com>

Shuo Chen

unread,
Sep 5, 2010, 6:58:11 AM9/5/10
to TopLanguage
继续测试,ping pong 测试表明,muduo 吞吐量比 libevent2 高 18% 以上。

http://blog.csdn.net/Solstice/archive/2010/09/05/5864889.aspx

Shuo Chen

unread,
Sep 5, 2010, 7:13:43 AM9/5/10
to TopLanguage
关于在本机测试,有一些客观原因。我只有两台电脑有千兆网口,其中一台还只是双核笔记本,运行的是桌面版 Linux。如果在这两台机器之间测试,基本
上只能跑 1 个或 2 个线程,测不出多线程的加速比。
另外,现在的 CPU 已经快到一个线程一个 TCP 连接就能很轻松地把千兆以太网的带宽跑满,所以用两台机器用 ping pong 方法测出来的
吞吐量不超过 1Gb/s ,无论连接数怎么变化和线程数怎么变化。
这样的测试结果没多大参考价值,因为过早地触到了物理界限。(或许 CPU 占用率有一点用。)

On Sep 5, 2:45 pm, qiaojie <qiao...@gmail.com> wrote:
> 这位老兄,没做过测试就不要乱下结论,你怎么知道他的程序CPU占用率就比asio高很多了?
> 而且你的话也很矛盾,一会说"asio快到任何人都望尘莫及",一会又说"cpp速度没c快",那你告诉我asio用什么开发的?
>

> 当然我也觉得楼主的测试有些草率和不严谨,首先不应该在同一台机器上测试,本机测试的话TCP并不通过网卡,而是直接在内存里通讯了,这样不可能准确的得到IO 吞吐量,其次应该补充一下两个测试中所用的IO模型,以及对瓶颈的分析。

qiaojie

unread,
Sep 5, 2010, 7:20:18 AM9/5/10
to pon...@googlegroups.com
如果是受限于网络带宽的话,可以尝试减小网络包的大小,改成256字节试试。


 
2010/9/5 Shuo Chen <gian...@gmail.com>

jigsaw

unread,
Sep 5, 2010, 9:26:44 AM9/5/10
to pon...@googlegroups.com
又看了下这篇比较。
楼主应该非常清楚libevent的适用范围吧?你这么比较是以己之长克人之短,很高明。

我之前说过了,你要光比thruput的话,什么技巧都不用,开一个tcp/udp链接,死循环收发,立刻把网卡和cpu都跑完。但这么做除了可以测试路由器性能之外别无它用。

而真实环境下通常是高并发的连接,也就是说同时打开几千个连接,每个连接都不停的收发小片的数据。这种情况下cpu切换线程的代价很高,所以才有了libevent这一类的库。
你的测试不仅只在单机跑,而且还开寥寥几个或者一个连接,那正和libevent的设计初衷是相悖的。
一个公允的测试用例是libevent自己的测试用例,开至少15000个连接。

你知道libevent只读4096byte,但你貌似不是很清楚为什么不干脆多读一些。有空想想为什么吧。cpu time slice是非常宝贵的资源,当你见识过跑几百万并发连接的服务器时就知道了。
我前段时间写了个驱动,主要是实现poll接口。应为硬件没提供中断,所以只有开个kernel thread不停的读硬件的标志位。后来压力测试时占用了1%~3%的cpu,结果只好打回来重写。每块blade16颗核,一共6块blade,哪怕0.5%的cpu占用率都让测试组的人fail test case。

2010/9/5 Shuo Chen <gian...@gmail.com>

jigsaw

unread,
Sep 5, 2010, 9:30:39 AM9/5/10
to pon...@googlegroups.com
>>另外,现在的 CPU 已经快到一个线程一个 TCP 连接就能很轻松地把千兆以太网的带宽跑满,所以用两台机器用 ping pong 方法测出来的
吞吐量不超过 1Gb/s ,无论连接数怎么变化和线程数怎么变化。

这句话也是错的。1个连接能跑满是没错;你试试看开1万个连接,看看还能不能跑满1G.

2010/9/5 jigsaw <jig...@gmail.com>

Zhang Jiawei

unread,
Sep 5, 2010, 9:30:55 AM9/5/10
to pon...@googlegroups.com
顶作者。

Zhang Jiawei

unread,
Sep 5, 2010, 9:33:28 AM9/5/10
to pon...@googlegroups.com
各位别挑刺了,别人用着就好。

Milo Yip

unread,
Sep 5, 2010, 1:50:16 PM9/5/10
to pon...@googlegroups.com
2010/9/5 jigsaw <jig...@gmail.com>:
>> slice是非常宝贵的资源,当你见识过跑几百万并发连接的服务器时就知道了。

* 不考虑广域网应用,只考虑局域网

不是所有應用都要開一百萬個連接吧。對於局域網的分佈式應用,連接數等於局域網內的節點數目己經足夠吧?

--
Milo Yip

Twitter @miloyip
http://www.cnblogs.com/miloyip/
http://miloyip.seezone.net/

jigsaw

unread,
Sep 5, 2010, 2:44:36 PM9/5/10
to pon...@googlegroups.com
要是要较真的话,局域网也可以有上百万的连接。比如无线终端,按IP地址来看都是局域网的。所以广域网局域网不是判定应用规模的条件。

我也不是说楼主的库不支持百万连接数所以不好。我的本意是说楼主的测试方法不仅有失偏颇--故意跟libevent比单连接的效率,而且以偏概全--以thruput作唯一数据来代表性能,所以是不能采信的。

2010/9/5 Milo Yip <mil...@gmail.com>

tony.jiao

unread,
Sep 5, 2010, 11:01:18 PM9/5/10
to pon...@googlegroups.com
支持.

Shuo Chen

unread,
Sep 7, 2010, 1:12:04 PM9/7/10
to TopLanguage
击鼓传花:对比 muduo 与 libevent2 的事件处理效率

在 IO 事件处理效率方面,muduo 与 libevent2 总体比较接近,各擅胜场。在并发量特别大的情况下(大于 30k),muduo 略
微占优。

http://blog.csdn.net/Solstice/archive/2010/09/08/5869801.aspx

jinhu wang

unread,
Sep 16, 2010, 1:48:50 AM9/16/10
to pon...@googlegroups.com

Reactor模式能理解成就是bridge模式的一个示例吧?

Shuo Chen

unread,
Sep 16, 2010, 2:40:37 AM9/16/10
to TopLanguage
no, 完全不是一个语境。 reactor 是解决"并发事件处理"这一具体问题的常用办法之一,不一定要面向对象,
也不一定要用继承和虚函数来实现。bridge 是一个抽象的面向对象的设计模式。跟 reactor 没啥关系。

On Sep 16, 1:48 pm, jinhu wang <wangjinhu...@gmail.com> wrote:
> Reactor模式能理解成就是bridge模式的一个示例吧?
>

jinhu wang

unread,
Sep 16, 2010, 3:15:59 AM9/16/10
to pon...@googlegroups.com
首先:设计模式没说是OO专有的吧:)
其次,处理事件的通行方式一般就是委托(bridge)和继承(template)。
所以我说reactor只是一种泛化了的bridge模式,即便跟OO划清界限。

chuang

unread,
Sep 16, 2010, 3:23:37 AM9/16/10
to pon...@googlegroups.com
reactor"模式"与bridge"模式"中的"模式"不是一个概念.
前者说的是处理网络I/O的一种方式, 后者是软件设计中的概念,风马牛不相及.

不要总把"模式"这个词联系到软件设计或者OO中去吧.

2010/9/16 jinhu wang <wangji...@gmail.com>

Shuo Chen

unread,
Sep 16, 2010, 3:37:39 AM9/16/10
to TopLanguage
说实话我真没看出 reactor 那里用到了 bridge 模式。哪个是 Abstraction, 哪个是
RefinedAbstraction,哪个是 Implementor,哪个是 ConcreteImplementor ?

reactor 的核心功能是用一个事件循环来处理多个文件描述符上的读写事件,并且支持定时器操作。我没有看出 bridge 与这个功能有任何具体
的联系。


On Sep 16, 3:15 pm, jinhu wang <wangjinhu...@gmail.com> wrote:
> 首先:设计模式没说是OO专有的吧:)
> 其次,处理事件的通行方式一般就是委托(bridge)和继承(template)。
> 所以我说reactor只是一种泛化了的bridge模式,即便跟OO划清界限。
>

jinhu wang

unread,
Sep 16, 2010, 4:01:45 AM9/16/10
to pon...@googlegroups.com
Abstraction是什么东西?

jinhu wang

unread,
Sep 16, 2010, 4:09:04 AM9/16/10
to pon...@googlegroups.com
如果在这里你能把“模式”这个词分成两个概念,我就真服了。
当专家处理特定问题的时候,如果复用了已有的一种成熟方法,那么这个方法就可以称其为模式。
23种OO设计模式只能说是老大们总结出来已有的模式来指导OO设计的。或者说是一种反向证明OO合理的一个论文集。
模式是死的,人是活的。

Shuo Chen

unread,
Sep 16, 2010, 4:14:23 AM9/16/10
to TopLanguage
Abstriction 是"桥"的一头,它下面的桥墩叫 RefinedAbstraction。
"桥"的另一头是 Implementor,那一头的桥墩叫 ConcreteImplementor。
以上 4 个部件构成了"桥接"模式。

http://en.wikipedia.org/wiki/Bridge_pattern

On Sep 16, 4:01 pm, jinhu wang <wangjinhu...@gmail.com> wrote:
> Abstraction是什么东西?
>

Mikster.Z

unread,
Sep 16, 2010, 4:14:31 AM9/16/10
to pon...@googlegroups.com
风牛马不相及也...处理模式跟设计模式就那么难理解么...

chuang

unread,
Sep 16, 2010, 4:15:44 AM9/16/10
to pon...@googlegroups.com
我表示无话可说了...

2010/9/16 jinhu wang <wangji...@gmail.com>

jinhu wang

unread,
Sep 16, 2010, 4:33:42 AM9/16/10
to pon...@googlegroups.com
嗯,我真的没有理解为何reactor模式不是设计模式?

jinhu wang

unread,
Sep 16, 2010, 4:45:21 AM9/16/10
to pon...@googlegroups.com
没必要僵化一些概念,我也是在07年的时候看到OSE architecture user's guide的design patterns这一章节后才跳离被那经典的束缚的。虽然reactor出自另一本书,但是你不得不承认它是处理并发的一个典型的设计模式。当看到一大堆handler的时候,很容易联想到它:)

up duan

unread,
Sep 16, 2010, 4:46:01 AM9/16/10
to pon...@googlegroups.com


2010/9/16 jinhu wang <wangji...@gmail.com>
嗯,我真的没有理解为何reactor模式不是设计模式?


The Proactor Design Pattern: Concurrency Without Threads

这是boost.asio中介绍asio用的标题

jinhu wang

unread,
Sep 16, 2010, 4:51:46 AM9/16/10
to pon...@googlegroups.com
3ks!呵呵,不是我胡说吧,还是Design pattern:)

jinhu wang

unread,
Sep 16, 2010, 4:59:33 AM9/16/10
to pon...@googlegroups.com
宏观角度看,Reactor还是自成一体了,
从行为角度看它是:观察者、职责链、中介者的组合体;
从结构角度看:不说桥接了,总之是将实现体引出去的影子,呵呵。

up duan

unread,
Sep 16, 2010, 5:06:15 AM9/16/10
to pon...@googlegroups.com


2010/9/16 jinhu wang <wangji...@gmail.com>

没必要僵化一些概念,我也是在07年的时候看到OSE architecture user's guide的design patterns这一章节后才跳离被那经典的束缚的。虽然reactor出自另一本书,但是你不得不承认它是处理并发的一个典型的设计模式。当看到一大堆handler的时候,很容易联想到它:)

 
不熟悉 bridge,不过这些东西只是一个名字,我不觉得bridge能够概括reactor所能表达的意思。

jinhu wang

unread,
Sep 16, 2010, 5:13:02 AM9/16/10
to pon...@googlegroups.com
肯定是概况不了,而且任何一个原子的设计模式都很难做出像样的基础组件来。

张慧聪

unread,
Sep 16, 2010, 6:22:22 AM9/16/10
to pon...@googlegroups.com
静观各位讨论,另外,似乎可以关注一下cwinux?

http://bbs.chinaunix.net/thread-1552986-1-1.html

--
http://blog.bukn.info

Walkley He

unread,
Sep 16, 2010, 7:28:16 AM9/16/10
to pon...@googlegroups.com
手里拿着锤子,满眼都是钉子

2010/9/16 jinhu wang <wangji...@gmail.com>

Shuo Chen

unread,
Sep 16, 2010, 8:27:06 AM9/16/10
to TopLanguage
reactor 有可能会用到观察者模式做事件通知,也可能用不到。比如 muduo 就没有用观察者模式。
另外一个文件描述符通常只有一个 handler,这也不完全符合 subject 与 observer 的一对多关系。

你说的另外两个模式在 reactor 里有哪些具体体现?
比如 handler 里有没有 successor?
又比如 reactor 里谁是 Mediator?谁是 ConcreteMediator?又有哪些 Colleague classes?

On Sep 16, 4:59 pm, jinhu wang <wangjinhu...@gmail.com> wrote:
> 宏观角度看,Reactor还是自成一体了,
> 从行为角度看它是:观察者、职责链、中介者的组合体;
> 从结构角度看:不说桥接了,总之是将实现体引出去的影子,呵呵。
>

qiaojie

unread,
Sep 16, 2010, 10:55:42 AM9/16/10
to pon...@googlegroups.com
Reactor跟Bridge根本不沾边,Reactor本身就算是个设计模式了,如果要比较的话最接近的应该是Active Object模式。
wiki上的解释:
http://en.wikipedia.org/wiki/Active_object




2010/9/16 jinhu wang <wangji...@gmail.com>

jinhu wang

unread,
Sep 17, 2010, 12:04:39 AM9/17/10
to pon...@googlegroups.com
手里拿着锤子,满眼都是钉子。这句话是最贴切的。模式化的思维。
Reactor本身是用以处理多路事件分离的一个模式,侧重点在于
  1. 多路事件并发
  2. 事件的1:N处理(对于fd的处理,往往是1:1)
观察者着重在事件变化通知,reactor管理器刚好是这样的一个被观察者。
职责链在事件的1:N处理的时候会出现它的影子,链式操作往往引入的是油漆匠算法,所以也是根据情况决定,
中介者的话reactor应该更明显了,例如两个server上的reactor之间的handler们,都是通过reactor来互动的。抽象提炼一下就是跨平台的另一种通信模式。
至于桥接,高度抽象一下的话,多路事件分离的实现体可以兼顾多操作系统,在高度一点,可以兼顾不同的事件同步接口。另外fd的handler可以很轻松的定制注册到reactor中,这本身其实也是桥接的影子。
另外我的以下理解不知是否极端:UML是设计师的语言,而设计模式是设计交流的关键词汇。从高度抽象向实现细节的过程中,一些模式渐渐就能呈现出来。从已有的源码反向工程去映照设计,也总能找到设计模式(包括开始没想到的设计)的踪迹。

殷远超

unread,
Sep 29, 2010, 10:33:03 AM9/29/10
to pon...@googlegroups.com
Reactor是模式没问题,但是和Bridge不同.
不能看到都有委托出现就当成一类,这个委托不出现在一个层面上.

Shuo Chen

unread,
Feb 2, 2011, 10:31:28 PM2/2/11
to pon...@googlegroups.com
Muduo 网络编程示例之零:前言

我将会写一系列文章,介绍用 muduo 网络库完成常见的 TCP
网络编程任务。这些例子都比较简单,逻辑不复杂,代码也很短,适合摘取关键部分放到博客上。其中一些有一定的代表性与针对性,比如“如何传输完整的文件”估计是网络编程的初学者经常遇到的问题。

http://blog.csdn.net/Solstice/archive/2011/02/02/6171831.aspx

> From: Shuo Chen <giantc...@gmail.com>
> Date: Sep 8 2010, 1:12 am
> Subject: 发布一个基于 Reactor 模式的 C++ 网络库
> To: TopLanguage
>
>
> 击鼓传花:对比 muduo 与 libevent2 的事件处理效率
>
> 在 IO 事件处理效率方面,muduo 与 libevent2 总体比较接近,各擅胜场。在并发量特别大的情况下(大于 30k),muduo
> 略
> 微占优。
>
> http://blog.csdn.net/Solstice/archive/2010/09/08/5869801.aspx
>
> On Sep 5, 6:58 pm, Shuo Chen <giantc...@gmail.com> wrote:
>
>> 继续测试,ping pong 测试表明,muduo 吞吐量比 libevent2 高 18% 以上。
>
>>http://blog.csdn.net/Solstice/archive/2010/09/05/5864889.aspx
>
>> On Sep 4, 4:35 pm, Shuo Chen <giantc...@gmail.com> wrote:
>
>> > 出乎我的意料,ping pong 测试表明,muduo 吞吐量比 boost.asio 高 15% 以上。
>
>> >http://blog.csdn.net/Solstice/archive/2010/09/04/5863411.aspx
>
>> > On Sep 1, 11:35 am, Shuo Chen <giantc...@gmail.com> wrote:
>

>> > > Muduo 是我在业余时间编写的基于Reactor模式的 C++ 网络库,适用于 Linux 平台,支持多线程。

Shuo Chen

unread,
Feb 2, 2011, 10:50:31 PM2/2/11
to TopLanguage
Muduo 网络编程示例之一:五个简单 TCP 协议

这是《Muduo 网络编程示例》系列的第一篇文章。本文将介绍五个简单 TCP 网络服务协议的 muduo 实现,包括 echo、
discard、chargen、daytime、time 等,以及 time 协议的客户端。以上五个协议使用不同的端口,可以放到同一个进程中实
现,且不必使用多线程。

http://blog.csdn.net/Solstice/archive/2011/02/02/6171905.aspx

Shuo Chen

unread,
Feb 3, 2011, 8:44:19 PM2/3/11
to TopLanguage
Muduo 网络编程示例之二:Boost.Asio 的聊天服务器

这是《Muduo 网络编程示例》系列的第二篇文章。 本文讲介绍一个与 Boost.Asio 的示例代码中的聊天服务器功能类似的网络服务程序,包
括客户端与服务端的 muduo 实现。这个例子的主要目的是介绍如何处理分包,并初步涉及 Muduo 的多线程功能。

http://blog.csdn.net/Solstice/archive/2011/02/04/6172391.aspx

Reply all
Reply to author
Forward
0 new messages