本文主要介绍Parallel.For以及Parallel.ForEach。Parallel.For是普通步长为1的for循环的并行代替方案。Parallel.ForEach是以集合为基准进行循环的foreach的并行代替方案。主要以下内容:

  1. 使用例子
  2. 如何退出并行循环
  3. Break、Stop详细介绍
  4. Partitioner

一、Parallel.For

1.1 使用例子

 class ParallelFor
{
private void Action(int index)
{
Console.WriteLine(index);
Thread.Sleep(1000);
}
public void ParallelAction()
{
Parallel.For(0, 10, (i) => Action(i));
}
} class Program
{
static void Main(string[] args)
{
var stopwatch = Stopwatch.StartNew();
stopwatch.Start();
new ParallelFor().ParallelAction();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
Console.Read();
}
}

1.2 运行截图

时间有很大的提升。

二、跳出循环:Break vs Stop

串行执行的for可以使用break/Stop关键字直接退出循环。Parallel.For可以通过loopState进行退出或者停止循环。

 class ParallelFor
{
private void Action(int index)
{
Console.WriteLine(index);
Thread.Sleep(1000);
}
public void ParallelAction()
{
Parallel.For(0, 10, (i, loopState) =>
{
if (i == 8)
{
loopState.Break();//loopState.Stop()
}
Action(i);
});
}
}

LoopState是循环体的第一个参数(可选),第一个是i。

三、 Break和Stop的区别

Break执行时,小于当前的index(i)的操作都会保证执行完成,大于当前index的迭代不再开始(不是不再执行)-》已经开始的还是会继续执行。

Break indicates that no iterations after the current iteration should be run. It effectively cancels any additional iterations of the loop. However, it does not stop any iterations that have already begun execution.

进一步说明:当index为8的循环开始执行时,index为1,2,3的循环不一定已经开始了。所以当Break执行后(index为8),会保证没有执行的1,2,3执行完毕

比如上面的例子i==8时,进行break,上面的代码执行截图:

0-7保证执行,8也打印出来了(有可能还会有10,9),是因为index8对应的循环在break之前已经开始了。

Stop执行时,Parallel会用最快的速度结束循环,如果小于当前执行stop的index对应的循环操作还没有开始,则不会执行这些没有开始的。所以Stop比Break能够更加快速的结束迭代。

Calling the Stop method indicates that any iterations of the loop that have not yet started need not be run. It effectively cancels any additional iterations of the loop. However, it does not stop any iterations that have already begun execution.

Calling the Stop method causes the IsStopped property to return true for any iteration of the loop that is still executing. This is particularly useful for long-running iterations, which can check the IsStopped property and exit early if its value is true.

Stop is typically employed in search-based algorithms, where once a result is found, no other iterations need be executed.

Break和Stop不能同时使用,会有异常抛出。

四、Continue功能。

Parallel.For是没有Continue关键字的,简单的使用Return即可完成Continue的功能。

 public void ParallelAction()
{
Parallel.For(, , (i) =>
{
if (i == )
{
return;
}
Action(i);
});
}

五、ParallelOptions

Parallel.For通用有ParallelOptions这个属性,通过这个可以指定CancellationSourceToken和MaxDegreeOfParallelism(最大并发数)

 public void ParallelAction()
{
var cts = new CancellationTokenSource();
var option = new ParallelOptions()
{
CancellationToken = cts.Token,
MaxDegreeOfParallelism = 5
};
Parallel.For(, , option, (i) =>
{
if (cts.Token.IsCancellationRequested)
{
return;
}
Action(i);
});
}

六、Partitioner

本文一直在讲解Parallel.For上面的操作对于Parallel.ForEach都是通用的。但是Parallel.ForEach有个特殊功能。Partitioner。

6.1 例子

class ParallelForEach
{
public void ParallelAction()
{
int[] items = new int[];
Parallel.ForEach(Partitioner.Create(0, 100000, 50000), (range) =>
{
Console.WriteLine("IN Parallel");
for (var i = range.Item1; i < range.Item2; i++)
{
items[i] = i;
}
});
}
}

上面代码的把1000000次分成两个50000进行,这两个50000之间是并行执行的,但是在每个50000(range)是串行自己执行的。上面程序会打印出两"IN Parallel"。

6.2说明

为什么要使用Partitioner?使用并行开发有两大开销,一是线程调度,二是调度代理方法,如果循环体本身开销很小,大量使用线程会得不偿失:调度本身的开销大于使用并行带来的性能提升。上面的例子可以看出,使用Partitioner减少了并行的次数,增大了循环体的体积。达到了并行和调度开销的协调。

Parallel Programming-Paralle.For && ForEach的更多相关文章

  1. Notes of Principles of Parallel Programming - TODO

    0.1 TopicNotes of Lin C., Snyder L.. Principles of Parallel Programming. Beijing: China Machine Pres ...

  2. 4.3 Reduction代码(Heterogeneous Parallel Programming class lab)

    首先添加上Heterogeneous Parallel Programming class 中 lab: Reduction的代码: myReduction.c // MP Reduction // ...

  3. Task Cancellation: Parallel Programming

    http://beyondrelational.com/modules/2/blogs/79/posts/11524/task-cancellation-parallel-programming-ii ...

  4. Samples for Parallel Programming with the .NET Framework

    The .NET Framework 4 includes significant advancements for developers writing parallel and concurren ...

  5. Parallel Programming for FPGAs 学习笔记(1)

    Parallel Programming for FPGAs 学习笔记(1)

  6. Parallel Programming AND Asynchronous Programming

    https://blogs.oracle.com/dave/ Java Memory Model...and the pragmatics of itAleksey Shipilevaleksey.s ...

  7. Introduction to Multi-Threaded, Multi-Core and Parallel Programming concepts

    https://katyscode.wordpress.com/2013/05/17/introduction-to-multi-threaded-multi-core-and-parallel-pr ...

  8. Fork and Join: Java Can Excel at Painless Parallel Programming Too!---转

    原文地址:http://www.oracle.com/technetwork/articles/java/fork-join-422606.html Multicore processors are ...

  9. A Pattern Language for Parallel Programming

    The pattern language is organized into four design spaces.  Generally one starts at the top in the F ...

  10. parallel programming. this causual litery nots represents my recent progress in parallel programming in c#.It`s interesting.

    not to say extra words,let`s start the code. pasted below: using System; using System.Collections.Ge ...

随机推荐

  1. C - Common Subsequence

    C - Common Subsequence Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I ...

  2. vscode 全局安装和配置 stylelint 像 webstorm 等 ide 一样来检查项目

    商店里安装完插件以后全局安装或者在项目中(记得加--save-dev)安装配置: npm install stylelint-config-recommended -g 然后在vscode setti ...

  3. spring web app的结构

    1 入口是web.xml tomcat加载war的时候会去读该入库文件. 2 web.xml中spring mvc的配置 定义servlet到servlet-mapping之间的映射,org.spri ...

  4. lua2json

    lua对象json序列化,很简单,没做中文的unicode编码了 local function bool2json(v) return v and "true" or " ...

  5. ABAP操作EXCEL (号称超级版)

    [转自http://www.cnblogs.com/VerySky/articles/2170014.html] *------------------------------------------ ...

  6. 【TFS】解决TFS编译中文乱码问题

    前言; TFS2018做程序集成非常方便,线上编译然后直接生成docker镜像,但是在使用过程中遇到编译窗口中文乱码的问题,这个问题找了好久没人知道怎么解决.如下: 这个问题不解决,每次编译失败,研发 ...

  7. hive查询注意及优化tips

    Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具.使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别, 所以需要去掉原有关系型数 ...

  8. 选股公式blog+节选

    <大智慧软件选股_大智慧软件如何选股>——一般性操作 http://jingyan.baidu.com/article/fa4125acb2028d28ac70923e.html < ...

  9. 每天一个Linux命令(32)date命令

          date命令是显示或设置系统时间与日期.        (1)用法:       用法:  date [选项]  [参数]       (2)功能:       功能:  根据指定格式显示 ...

  10. 面向对象分析与设计(C++)课堂笔记

    第一次课: 对象是程序设计最基本的单元 对象:对象标识.属性.操作(对象标识又分为内部标识.外部标识) 三三制原则 继承:英文语义”is a kind of” 自动的拥有或隐含的复制 虚基类:解决多继 ...