事件驱动实现单线程实现并发 真正的高效并发

来源:互联网 发布:淘宝购物分享在哪里 编辑:程序博客网 时间:2024/05/17 23:22

单线程并发其实本质就是事件驱动加上异步系统调用。 这个在7年前就像做过,但是鉴于工作不需要也就没有去实现。 最近几年某个大型存储虚拟化系统就是事件驱动,而且一个cpu一个polling线程。

普通的并发实现依赖于多线程,然而多线程的切换中的上下文切换用到了用户空间,内核空间是几千行的内核代码的执行。 这个极大的浪费了系统资源。 另外,在某些比较实时的应用中,request的请求依赖于正在执行的线程是否yeld()。


单线程实现多路并发依赖于polling函数,去查询事件,这个可以自己实现也可以用系统函数,譬如select(), epoll().   如果某个request请求的处理涉及的逻辑比较复杂,涉及到和其他模块的交互,甚至许多数据库操作、文件操作、socket操作等,那么实现就会比较复杂。
1. 针对某个request创造上下文,也就是自己实现context,记住一定要有ID标记哦。

2. 对复杂request请求使用状态机处理。 不同的步骤,对应不同的状态。

3. 不允许有阻塞操作,如果设计到文件、socket、数据库等,必须使用其异步操作,不然会阻塞polling 线程的执行。 

4. 非阻塞而且异步。非阻塞还不够,非阻塞不一定是异步。 如果某个操作譬如数据库操作,调用时候执行条件满足于是立即执行了,但是执行时间久且在另外的节点上。于是可以异步操作。

5. 既然是异步,则必须有完成时的回调函数,完成方必须给出事件或者直接回调 callback.

6.根据系统性质,确定代码回到polling函数的时间,确定单个任务执行的最大时间。 如果某个任务确实需要大量的代码和时间,那么建议添加slow task机制。


开源事件驱动库: ibevent,libev和libuv

http://hi.baidu.com/jakisou/item/9fa97a32b5c99d637c034bc6


系统异步操作介绍

//linux 非阻塞 文件读写I/O介绍 AIO

http://blog.csdn.net/gotosola/article/details/7411688

//linux 下文件异步操作介绍 AIO_read  的使用

http://blog.csdn.net/wenhuiqiao/article/details/7066267


//数据库异步操作, sql_server的很多操作支持异步。


//socket支持异步。


无堵塞并发编程

http://www.jdon.com/42781


http://blog.chinaunix.net/uid-22939760-id-186334.html