多线程的 pipeline 设计模式
2008-04-22 16:49
801 查看
一个简单例子:
有很多个html网页,网页的id、title、url、path等信息存在一个数据库表中,网页内容存储在一个磁盘阵列上。现在要把所有网页都读出来,统计其中的html标签、正文等信息,并写入另一个数据库表,怎样的设计最好呢?
一般的想法是使用多个平行的线程,每个线程处理某个ID范围的网页。但是仔细分析就可以发现,对每个网页的处理可以分为以下处理步骤:
读取数据库行
读取文件内容
解析html,生成统计数据
将统计结果写入数据库
这几个处理步骤有各自的特征,读取数据库的时间一般主要消耗在数据库服务器响应,读取文件内容一般主要消耗在磁盘IO上,解析、统计消耗在计算上,写统计结果也消耗在数据库服务器响应上。如果我们为这几个过程建立各自的线程,每个任务通过消息队列来传递。就得到如下设计:
在这个设计中,每个处理过程可以根据需要设置不同的线程数,这个例子中,数据库不会是瓶颈,只剩下读文件和计算,如果文件IO够快(如果网页存在不同的阵列上),那么可以增加计算线程(服务器一般都是多CPU的)来达到平衡。
一些例子或许还会有更多的处理步骤。
可以从中得出一个设计模式,见实现代码
有很多个html网页,网页的id、title、url、path等信息存在一个数据库表中,网页内容存储在一个磁盘阵列上。现在要把所有网页都读出来,统计其中的html标签、正文等信息,并写入另一个数据库表,怎样的设计最好呢?
一般的想法是使用多个平行的线程,每个线程处理某个ID范围的网页。但是仔细分析就可以发现,对每个网页的处理可以分为以下处理步骤:
读取数据库行
读取文件内容
解析html,生成统计数据
将统计结果写入数据库
这几个处理步骤有各自的特征,读取数据库的时间一般主要消耗在数据库服务器响应,读取文件内容一般主要消耗在磁盘IO上,解析、统计消耗在计算上,写统计结果也消耗在数据库服务器响应上。如果我们为这几个过程建立各自的线程,每个任务通过消息队列来传递。就得到如下设计:
在这个设计中,每个处理过程可以根据需要设置不同的线程数,这个例子中,数据库不会是瓶颈,只剩下读文件和计算,如果文件IO够快(如果网页存在不同的阵列上),那么可以增加计算线程(服务器一般都是多CPU的)来达到平衡。
一些例子或许还会有更多的处理步骤。
可以从中得出一个设计模式,见实现代码
相关文章推荐
- JAVA多线程编程设计模式:Pipeline(流水线)模式
- 多线程的 pipeline 设计模式
- 多线程设计模式——Pipeline(流水线)模式
- 多线程的 pipeline 设计模式
- 多线程设计模式--Future模式
- 多线程设计模式之Master-worker模式
- 黑马程序员--Java学习日记之总结复习(多线程和设计模式)
- Java多线程编程实战指南(设计模式篇,黄文海)-之管道线模式
- android GUI为何不设计成多线程模式
- java基础—多线程下的单例设计模式的安全问题
- 多线程设计模式总结(一)
- iOS 开发 多线程详解之GCD应用延迟操作,单例设计模式,调度组
- 多线程-单例设计模式懒汉 饿汉
- 【多线程高并发】多线程的设计模式
- 多线程的设计模式
- 3-2-Java多线程-案例-单例设计模式出现的问题
- Android多线程设计模式---wait()和notify()机制
- Java基础进阶_day16_(多线程,互斥锁,线程池,定时器,设计模式)
- 网络与多线程的设计模式
- 设计模式-单例模式之饿汉式-多线程