- 论坛徽章:
- 0
|
原帖由 清汤挂面 于 2007-7-6 15:26 发表
I've done the reactor service frame
reactor 是按 ACE 的接口来实现,还是按 libevent 的接口来实现?
ACE 使用的是 OO 的接口,libevent 使用的是 C 的 callback 。
ACE 基于 OO 的接口
- class Event_Handler {
- pupblic:
- virtual void handle_input( HANDLE handle ) = 0;
- virtual void handle_output( HANDLE handle ) = 0;
- virtual void handle_timeout( const Time_Value & ) = 0;
- virtual void handle_close( HANDLE handle, Event_Type et ) = 0;
- };
复制代码
libevent 基于 C 的 callback 的接口
- void event_set(struct event * ev, int fd, short event,
- void ( * fn)(int, short, void * ), void * arg);
复制代码
fn 就是 calback,通常的实现类似
- void fifo_read(int fd, short event, void *arg);
复制代码
libevent 的实现方式,其实类似于 《unix网络编程》 (第二版,中文版) Page 141 和 Page 148 的代码。可以看看这里的说明:http://iunknown.javaeye.com/blog/41077
一般情况下,如果业务处理逻辑不涉及过多的 IO 操作,使用单线程运行reactor 的效果是非常好的。比如 memcached 在 1.2 之前的版本就是单线程运行 libevent 实现的,性能非常好。在 memcached 中只有网络请求和响应是 IO 操作,内部的处理逻辑只是 HASH 表的查找和维护,不会造成阻塞,因此使用单线程是完全没有问题的。
但如果业务处理逻辑还涉及很多其他的 IO 操作的话,那么或者把这些 IO 操作也纳入 reactor 的控制,要么就需要使用多线程了。但在某些情况下,业务中涉及的 IO 操作是类似数据库查询这样的 IO 操作,这些 IO 操作很难纳入 reactor 的控制,就要使用多线程了。
[ 本帖最后由 iunknown 于 2007-7-6 19:49 编辑 ] |
|