.net Parallel并行使用

因项目响应过慢,代码优化空间不大,在暂时无法调整系统架构的情况下,只有使用.NET中的TPL解决一些模块耗时过多的问题。但在使用过程中也碰到了一些问题,现在把它写下来,用于备忘。

1. Parallel.ForEach的使用

 1         static void Main(string[] args)
 2         {
 3             //Test();
 4             TestParllel();
 5             Console.ReadLine();
 6         }
 7
 8         private static void TestParllel()
 9         {
10             var list = new List<int>(6000);
11
12             for (int i = 0; i < 6000; i++)
13             {
14                 list.Add(i);
15             }
16             Parallel.ForEach(list, (p, state) => { Invoke(p); });
17         }
18
19         static void Invoke(int i)
20         {
21             Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
22             Thread.Sleep(30000);
23         }

未设置最大线程数的情况下:

a>为设置最大线程的情况下,TPL默认线程数为任务数(系统允许的情况下,设置ThreadPool.SetMaxThreads没有效果)。

b> TPL默认启动5个线程,任务数小于5的话,启动任务数个线程。

c> 如果任务较多,TPL在初始化5个线程后,每隔100毫秒左右新增线程,直到达到最大线程数。如果新增线程的过程中有任务完成,那么就不会新增线程。

缺点:线程数无法控制,容易造成高CPU,系统失去响应。

设置了最大线程数的情况下:

 1        private static void TestParllel()
 2         {
 3             var list = new List<int>(6000);
 4
 5             for (int i = 0; i < 6000; i++)
 6             {
 7                 list.Add(i);
 8             }
 9             Parallel.ForEach(list, new ParallelOptions { MaxDegreeOfParallelism = 2}, (p, state) => { Invoke(p); });
10         }

设置了最大线程数为2

a> 系统运行可控,不会造成高CPU的情况。

时间: 2024-08-26 06:24:26

.net Parallel并行使用的相关文章

Parallel并行编程初步

Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工作.耗时的CPU计算操作选择并行是明智的.通常情况,每个CPU核心代表一个硬件线程,但超线程技术,可以使一个cpu核心具有两个硬件线程.软件线程顾名思义就是我们在程序中所开启的. 下面看一个最基础的并行编程的例子,也足以体现多核心并行运行的好处,当然微软.NET为我们封装后,我们也不必过多关注底层操作,那我们就看一下运行结果

Parallel并行之乱用

关于Parallel我也不细说了,一则微软封装的很好用,二来介绍这个的遍地都是. 我要说的是,要想成为一个优秀的标题党,一定要把重点放到别的地方,为了节省大家阅读时间,我先把结论说了,然后再慢慢从头说,愿意往下看的可以看看因果,不愿意看的,也算咱给大家提个醒吧. 结论就是,大家在做单元测试用例的时候一定要用心,这篇随笔是要检讨并警醒下自己并与大家共勉. 据一些我不记得名字的国外权威专家,据说是测试大师级人物研究,测试用例的出现的错误并不比被测试的代码少,我相信大多数人会和我类似,在写代码的时候小

Parallel并行编程

Parallel并行编程 Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工作.耗时的CPU计算操作选择并行是明智的.通常情况,每个CPU核心代表一个硬件线程,但超线程技术,可以使一个cpu核心具有两个硬件线程.软件线程顾名思义就是我们在程序中所开启的. 下面看一个最基础的并行编程的例子,也足以体现多核心并行运行的好处,当然微软.NET为我们封装后,我们也不必过多关注底层操

oracle parallel 并行 设置 理解

引子:以前一直没太关注oracle并行这个特性.前几天一个兄弟碰到的一个问题,才让我觉得这个东西还是有很多需要注意的地方,有必要仔细熟悉下.其实碰到的问题不复杂: 类似如下的一条语句:insert into xxxx select /+parallel(a) / * from xxx a;数据量大约在75G左右,这位兄弟从上午跑到下午还没跑完,过来问我咋回事,说平常2hrs能跑完的东西跑了好几个小时还撒动静.查看系统性能也比较 正常,cpu,io都不繁忙,平均READ速度在80M/s左右(勉强凑

Stream parallel并行流的思考

1.并行流并不一定能提高效率,就和多线程并不能提高线程的效率一样 因为引入并行流会引起额外的开销,就像线程的频繁上下文切换会导致额外的性能开销一样,当数据在多个cpu中的处理时间小于内核之间的传输时间,使用并行流也就没有什么意义了. 这边用代码演示一下 public static long iterativeSum(long n) { long result = 0; for (long i = 1L; i <=n; i++) { result += i; } return result; }

[CSAPP]并发与并行

学了这么久的计算机,并发与并行的概念理解的一直不够透彻.考研复习那会儿,以为自己懂了,然而直到看了CSAPP才算是真正明白了这俩个概念. 并发(concurrency) 流X和流Y并发运行是指,流X在流Y开始之后结束之前开始运行,或者流Y在流X开始之后结束之前开始运行. 如图,进程A与进程B并发,进程A与进程C并发,进程B与进程C非并发. 并行(parallel) 并行是并发的真子集. 并发有可能发生在单处理器上,也可能在多处理器上.流A和流B并行,则流A和流B并发地运行在不同的处理器上. 来自

OpenMP并行程序设计——for循环并行化详解

转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/40018735 在C/C++中使用OpenMP优化代码方便又简单,代码中需要并行处理的往往是一些比较耗时的for循环,所以重点介绍一下OpenMP中for循环的应用.个人感觉只要掌握了文中讲的这些就足够了,如果想要学习OpenMP可以到网上查查资料. 工欲善其事,必先利其器.如果还没有搭建好omp开发环境的可以看一下OpenMP并行程序设计--Eclipse开发环境的搭建 首

线程(Thread,ThreadPool)、Task、Parallel

线程(Thread.ThreadPool) 线程的定义我想大家都有所了解,这里我就不再复述了.我这里主要介绍.NET Framework中的线程(Thread.ThreadPool). .NET Framework中的线程分为两类:1.前台线程:2.后台线程. 1.前台线程 class Program { static void Main(string[] args) { Console.WriteLine("=====Thread====="); TestThread(); Cons

在Parallel中使用DbSet.Add()发现的一系列多线程问题和解决过程

发现问题 需求很简单,大致就是要批量往数据库写数据,于是打算用Parallel并行的方式写入,希望能利用计算机多核特性加快程序执行速度.想的很美好,于是快速撸了类似下面的一串代码: using (var db = new SmsEntities()) { Parallel.For(0, 1000, (i) => { db.MemberCard.Add(new MemberCard() { CardNo = "NO_" + i.ToString(), Banlance = 0, C