Chinaunix首页 | 论坛 | 博客
  • 博客访问: 492422
  • 博文数量: 78
  • 博客积分: 995
  • 博客等级: 准尉
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-15 20:22
个人简介

技术中沉思的时候最快乐,问题得到完美解决的时候最有成就感!

文章分类

全部博文(78)

文章存档

2013年(39)

2012年(37)

2011年(2)

分类: LINUX

2012-08-23 17:23:09

全异步非阻塞svr需要一个好的易用功能强大的事件驱动器,接触过好几个这样的驱动器:比如

1,nginx的核心evt dirver,和http业务绑的非常紧,耦合非常重,基本很难抽取出来独用;

2,工作中用的最多的reactor,一个从java基本照搬到c++的事件驱动,只支持句柄读写+定时器
事件,比较简单,简单到有点粗略功能局限,工作中用了感觉还好,但是离理想驱动器非常远;

3,python的trwist框架是我感觉最强大,功能最丰富的驱动器,支持非常多种事件,且支持扩展
异步事件;另外包括了众多的上层应用(比如http,ftp,mail),研究了大概1周,确实很有趣;但感觉
过于复杂了,且是python写的,用python写这种异步svr现在不会去搞,以后应该会用这个实现一个框架;
日后再说;

4,libevent 感觉是离完美最近的异步驱动器了,支持句柄+定时器+信号事件;c写的,接口友好
稳定,且有大批应用;

但我还是最终实现了一个自己的驱动器,原因有三:
一来,libevent的事件支持有限,特别是我最喜欢的子进程调用(类似异步popen)事件不支
持(python中就有,非常好用);
二来,libevent的接口是比较友好,但我还是更倾向于在驱动器应和中层的应用有一定的交互和
耦合,比如时间,驱动器的timer肯定依赖于时间,而中层框架代码也肯定是需要时间的;我不想再在中层
应用中再去实现一遍时间功能;
三来,实现驱动器是一件很好玩的事情,强烈的欲望驱动我自己去实现一个,再造一次轮子,当然
这个轮子不是白手起家造的;是吸取了各个驱动器的优点,摒弃了缺点造的;

轮子造出来了,支持事件包括:
句柄读写,定时器,信号,子进程调用;
以下是接口api,接口没有 libevent 的接口清晰和易用,比如要注册一个fd读事件,需要先分配
事件,然后再注册;稍显繁琐,但更灵活,也更适合嫁接在这层驱动器上的框架代码;
另外,感觉对事件的包装上有些地方不合理的地方,如果不熟悉使用起来会感到一些迷惑...

接口设计要想清晰合理好用且正交无冗余确实不是一件易事,需要花费很大力气以及有丰富的经验
才行;
  1. yf_evt_driver_t* yf_evt_driver_create(yf_evt_driver_init_t* driver_init);
  2. void yf_evt_driver_destory(yf_evt_driver_t* driver);

  3. void yf_evt_driver_stop(yf_evt_driver_t* driver);
  4. void yf_evt_driver_start(yf_evt_driver_t* driver);


  5. yf_int_t yf_alloc_fd_evt(yf_evt_driver_t* driver, yf_fd_t fd
  6.                 , yf_fd_event_t** read, yf_fd_event_t** write, yf_log_t* log);
  7. yf_int_t yf_free_fd_evt(yf_fd_event_t* pread
  8.                 , yf_fd_event_t* pwrite);

  9. /*
  10. *oneshot event handler, means one register just call handle once...
  11. */
  12. yf_int_t yf_register_fd_evt(yf_fd_event_t* pevent, yf_time_t *time_out);
  13. /*
  14. *unregister used before event happen, means interupt fd poll
  15. */
  16. yf_int_t yf_unregister_fd_evt(yf_fd_event_t* pevent);

  17. #define FD_TIMER_NEW 0x01
  18. #define FD_TIMER_DEL 0x02
  19. /*
  20. * timer_new : fi org event have timer, then will cancel org first,
  21. * then add new with 0 passed time;
  22. * timer_del : cancell org
  23. */
  24. yf_int_t yf_fd_evt_timer_ctl(yf_fd_event_t* pevent, int mode, yf_time_t* time_out);


  25. yf_int_t yf_alloc_tm_evt(yf_evt_driver_t* driver, yf_tm_evt_t** tm_evt
  26.                 , yf_log_t* log);
  27. yf_int_t yf_free_tm_evt(yf_tm_evt_t* tm_evt);

  28. yf_int_t yf_register_tm_evt(yf_tm_evt_t* tm_evt, yf_time_t *time_out);
  29. yf_int_t yf_unregister_tm_evt(yf_tm_evt_t* tm_evt);

  30. /*
  31. * singal evt
  32. * in one processor, you can just register signo with one handler
  33. */
  34. yf_int_t yf_register_singal_evt(yf_evt_driver_t* driver
  35.                 , yf_sig_event_t* sig_evt, yf_log_t* log);

  36. yf_int_t yf_unregister_singal_evt(yf_evt_driver_t* driver
  37.                 , int signo);

  38. yf_int_t yf_alloc_proc_evt(yf_evt_driver_t* driver, yf_processor_event_t** proc_evt
  39.                 , yf_log_t* log);
  40. yf_int_t yf_free_proc_evt(yf_processor_event_t* proc_evt);

  41. yf_int_t yf_register_proc_evt(yf_processor_event_t* proc_evt, yf_time_t *time_out);
  42. yf_int_t yf_unregister_proc_evt(yf_processor_event_t* proc_evt);

  43. yf_process_t* yf_get_proc_by_evt(yf_processor_event_t* proc_evt);

具体代码我放 github 上了:


阅读(3016) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~