b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

parallel.foreach_第一天 Parallel的使用

电脑杂谈  发布时间:2016-04-25 08:00:36  来源:网络整理

你是否正在寻找关于parallel.foreach的内容?让我把最有价值的东西奉献给你:

随着多核时代的到来,并行开发越来越展示出它的强大威力,像我们这样的码农再也不用过多的关注底层线程的实现和手工控制,

要了解并行开发,需要先了解下两个概念:“硬件线程”和“软件线程”。

1. 硬件线程

相信大家手头的电脑都是双核以上的,像我这样古董的电脑都是双核的,这样的双核叫做物理内核。

parallel.foreach_第一天 Parallel的使用

硬件线程又叫做逻辑内核,我们可以在”任务管理器“中查看”性能“标签页,如下图,我们知道有2个硬件线程。

parallel.foreach_第一天 Parallel的使用

一般情况下,一个物理内核对应一个逻辑内核,比如我这里的2对2。当然如果你的cpu采用的是超线程技术,那么可能就会有4个物理内核对应

8个硬件线程,现在有很多服务器都有8个硬件线程,上午在公司的服务器上截了个图。

parallel.foreach_第一天 Parallel的使用

我们要知道并行开发要做的事情就是将任务分摊给这些硬件线程去并行执行来达到负载和加速。

2. 软件线程

相信这个大家最熟悉了,我们知道传统的代码都是串行的,就一个主线程,当我们为了实现加速而开了很多工作线程,这些工作线程

也就是软件线程。

好,我们知道了基本概念就ok了,在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threading.Tasks。这里面有很多好玩

的东西,作为第一篇就介绍下最基础,最简单的Parallel的使用。

parallel.foreach_第一天 Parallel的使用

一:Parallel的使用

在Parallel下面有三个常用的方法invoke,for和forEach。

1: Parallel.Invoke

这是最简单,最简洁的将串行的代码并行化。

Main(, watch.ElapsedMilliseconds);
, watch.ElapsedMilliseconds);
Run1()
);
Run2()
);
35 Thread.Sleep(5000);
36 }
37 }

parallel.foreach_第一天 Parallel的使用

在这个例子中可以获取二点信息:

第一:一个任务是可以分解成多个任务,采用分而治之的思想。

第二:尽可能的避免子任务之间的依赖性,因为子任务是并行执行,所以就没有谁一定在前,谁一定在后的规定了。

2:Parallel.for

我们知道串行代码中也有一个for,但是那个for并没有用到多核,而Paraller.for它会在底层根据硬件线程的运行状况来充分的使用所有的可

利用的硬件线程,注意这里的Parallel.for的步行是1。

这里我们来演示一下,向一个线程安全的集合插入数据,当然这个集合采用原子性来实现线程同步,比那些重量级的锁机制更加的节省消耗。

Main(, j);
(, bag.Count, watch.ElapsedMilliseconds);
, bag.Count, watch.ElapsedMilliseconds);
36
37 GC.Collect();
38
39 }
40 }
41 }

parallel.foreach_第一天 Parallel的使用

可以看的出,加速的效果还是比较明显的。

3:parallel.foreach
forEach的独到之处就是可以将数据进行分区,每一个小区内实现串行计算,分区采用Partitioner.Create实现。

, j);
ConcurrentBag<, bag.Count, watch.ElapsedMilliseconds);
GC.Collect();
bag = , bag.Count, watch.ElapsedMilliseconds);
GC.Collect();
}
}
}

parallel.foreach_第一天 Parallel的使用

这里还是要说一下:Partitioner.Create(0, 3000000)。

第一:我们要分区的范围是0-3000000。

第二:我们肯定想知道系统给我们分了几个区? 很遗憾,这是系统内部协调的,无权告诉我们,当然系统也不反对我们自己指定分区个数,

这里可以使用Partitioner.Create的第六个重载,比如这样:Partitioner.Create(0, 3000000, Environment.ProcessorCount),

因为Environment.ProcessorCount能够获取到当前的硬件线程数,所以这里也就开了2个区。

下面分享下并行计算中我们可能有的疑惑?

<1> 如何中途退出并行循环?

是的,在串行代码中我们break一下就搞定了,但是并行就不是这么简单了,不过没关系,在并行循环的委托参数中提供了一个

ParallelLoopState,该实例提供了Break和Stop方法来帮我们实现,。

Break: 当然这个是通知并行计算尽快的退出循环,比如并行计算正在迭代100,那么break后程序还会迭代所有小于100的。

Stop:这个就不一样了,比如正在迭代100突然遇到stop,那它啥也不管了,直接退出。

下面举个例子,当迭代到1000的时候退出循环

Main((bag.Count == , bag.Count);
22
23 }
24 }

<2> 并行计算中抛出异常怎么处理?


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-2840-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...