本文参考的博文出处:http://www.cnblogs.com/stoneniqiu/p/4857021.html
总体说明:
(1)、理解硬件线程和软件线程
硬件线程也称为逻辑内核,一个物理内核可以使用超线程技术提供多个硬件线程。所以一个硬件线程并不代表一个物理内核;Windows中每个运行的程序都是一个进程,每一个进程都会创建并运行一个或多个线程,这些线程称为软件线程。硬件线程就像是一条泳道,而软件线程就是在其中游泳的人。
(2)Net Framework4 引入了新的Task Parallel Library(任务并行库,TPL),它支持数据并行、任务并行和流水线。让开发人员应付不同的并行场合。
- 数据并行:有大量数据需要处理,并且必须对每一份数据执行同样的操作。比如通过256bit的密钥对100个Unicode字符串进行AES算法加密。
- 任务并行:通过任务并发运行不同的操作。例如生成文件散列码,加密字符串,创建缩略图。
- 流水线:这是任务并行和数据并行的结合体。
TPL引入了System.Threading.Tasks ,主类是Task,这个类表示一个异步的并发的操作,然而我们不一定要使用Task类的实例,可以使用Parallel静态类。它提供了Parallel.Invoke, Parallel.For Parallel.Forecah 三个方法。
一、业务场景
目前在模拟工作中可能遇到的一个场景,从中间服务器读取xml文件,分别为两法刑事案件信息,两法行政案件信息(目前模拟的两个xml文件单词导入的业务数据量在20000~30000条左右),对应两张数据库表为[Sys_TwoLawsConvergence_AdministrationCase]、[Sys_TwoLawsConvergence_PoliceCase],表结构及具体字段如下所示。
其中,主键并非为自增,主键的维护由对接应用系统统一提供(目前并未建立任何索引,后期准备深入研究一下 sql server 的 b树索引及位图索引)。
考虑到,同时向两张数据表插入数据,除去使用多线程同时写入外,.net framework 4.0 提供了新的Task Parallel Library(任务并行库,TPL),它支持数据并行、任务并行和流水线。在此业务场景,我采用了最简单的方法,及Parallel类的Invoke()方法,通过Stopwatch,准确测量并行执行插入数据与串行执行插入数据在执行效率上的对比。
二、具体实现
定义了NetCloudPoliceInsertData、NetCloudAdministrationInserData类,分别为两法刑事案件信息写入类及两法行政案件信息写入类具体结构及方法如下
(1)NetCloudPoliceInsertData类
其中DataAccessFactory.Instance().GetDataAccess("Sql Server");DataAccessFactory为自定义的数据访问类,此处工厂模式保证工厂类对象在内存中有且仅有一个,每一次GetDataAccess()都会创建一个数据库连接(非连接池的方式),写入库表的方式采用批量执行
(2)NetCloudAdministrationInserData类
三、并行执行与串行执行效率比较
(1) Execute
其中 Parallel静态类的Invoke方法注释为【尽可能并行执行提供的每个操作】,在输出执行语句后,可以看到并行执行的执行效果,如下图所示:
四、运行结果比较
并行执行结果时间:
串行执行结果时间:
并行执行在时间上比串行执行时间上少2分钟左右,此次导入的数据量为20000条,后期会追加大数量的导入,以检验并行执行的效果。