Parallel Programming-Task Base
Parallel.For/ForEach是数据层面的并行,本文所讲的Task是将不同的操作并行执行,本文主要内容:
- Task的工作模型
- 初始化Task
- 完成Task
- 取消Task
一、Task工作模型
.Net中Task的工作模式是Fork/Join或者Master/Worker模式。核心思想是Master负责接受Client的请求,并且负责将请求分配给最终的Wroker,Worker执行完自己的工作后分别返回给Master。由Master汇总最终的结果并且返回给Client。

在.Net的Task并行编程中。一个Worker代表一个Task。
二、初始化Task
2.1Parallel.Invoke
Parallel.Invoke是最简单的办法Task并行编程模式。
2.2 TaskFactory.StartNew
该方法会创建一个Task用于执行作为参数的方法。
class TaskDemo
{
public void Action1()
{
Console.WriteLine("in action1");
} public void Action2()
{
Console.WriteLine("in action2");
} public void StartTasks()
{
var task1 = Task.Factory.StartNew(Action1);
var task2 = Task.Factory.StartNew(Action2);
Task.WaitAll(task1, task2);
}
}
以上代码使用TaskFactory.StartNew方法创建了两个Task。task1用于执行Action1,task2用于执行Action2.
StartNew只是创建了一个task,并将该task加入到一个工作队列(work queue),当时该Task并没有马上执行,task什么时候执行是由TaskScheduler决定。TaskScheduler会将需要执行的task从中拿出来,然后才开始执行。(以上代码使用的是默认TaskScheduler)

TaskScheduler很可能马上执行,也有可能在未来的某一个特定时间点进行执行,取决于调度算法,以及CPU资源等。
三、Task的完成
刚开始说了。Task编程使用的是Master/Worker模式,该模式中最后一点是Worker最终会将结果返回给Master。由Master统一将结果进行汇总。在Task编程中有两个方法:
- Task.WaitAll。等待所有的Task(worker)完成。
- Task.WaitAny,等待任何一个Task完成即可。
3.1 Task.WaitAll
上面2.2的代码中已经使用了WaitAll,该方法将会等待两个Action完成之后才会进行返回,将上面的方法做一点改变。
class TaskDemo
{
public void Action1()
{
Thread.Sleep();
Console.WriteLine("in action1");
} public void Action2()
{
Thread.Sleep();
Console.WriteLine("in action2");
} public void StartTasks()
{
var task1 = Task.Factory.StartNew(Action1);
var task2 = Task.Factory.StartNew(Action2);
Task.WaitAll(task1, task2);
Console.WriteLine("Finished");
}
}
WaitAll之后再打印出”Finished“,按照WaitAll的定义,Finished永远是最后打印出来的字符串。

3.2 Task.WaitAny
将上面代码的WaitAll修改成WaitAny
public void StartTasks()
{
var task1 = Task.Factory.StartNew(Action1);
var task2 = Task.Factory.StartNew(Action2);
Task.WaitAny(task1, task2);
Console.WriteLine("Finished");
}
最终运行结果:

可以看出使用了WaitAny后,没有等待Task2执行完毕,程序就回到了主线程,先打印出了Finished。
四、取消Task
4.1 取消流程
Task取消使用一个叫做coorperative cancellation的模型进行Task取消。主要使用CancellationTokenSource完成。该对象有一个CancellactionToken。当StartNew一个Task时候,可以将toker传给被创建的task。当CancellationTokenSource调用Cancel后,Task对应的Token状态将会变为取消(Canceled),Task的状态也会变为取消。这时候如果Task还没有启动,Task将不会再执行任务。

当然最后在每个Task内部也对Token进行判断,如果token已经取消,则不再执行当前Action(有些task可能在CancellactionToke被取消之前已经启动了),修改一下执行图:

4.2 演示代码
class TaskDemo
{
public void Action1(CancellationTokenSource cts)
{
if(cts.IsCancellationRequested)
{
return;
}
Console.WriteLine("in action1");
} public void Action2(CancellationTokenSource cts)
{
Thread.Sleep();
if (cts.IsCancellationRequested)
{
Console.WriteLine("action2 is canceled");
return;
}
Console.WriteLine("in action2");
} public void StartTasks()
{
CancellationTokenSource cts = new CancellationTokenSource();
var task1 = Task.Factory.StartNew(() => Action1(cts), cts.Token);
var task2 = Task.Factory.StartNew(() => Action2(cts), cts.Token);
Task.WaitAny(task1, task2);
cts.Cancel();
Console.WriteLine("Finished");
}
}
4.3 运行结果

上面的运行结果有可能“action2 is canceled"这句话不会打印出来,因为有可能在Task2执行之前cts已经取消了。会进入流程图中第一个If判断点==》Not will run task
Parallel Programming-Task Base的更多相关文章
- Task Cancellation: Parallel Programming
http://beyondrelational.com/modules/2/blogs/79/posts/11524/task-cancellation-parallel-programming-ii ...
- Notes of Principles of Parallel Programming - TODO
0.1 TopicNotes of Lin C., Snyder L.. Principles of Parallel Programming. Beijing: China Machine Pres ...
- Samples for Parallel Programming with the .NET Framework
The .NET Framework 4 includes significant advancements for developers writing parallel and concurren ...
- 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 ...
- 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 ...
- A Pattern Language for Parallel Programming
The pattern language is organized into four design spaces. Generally one starts at the top in the F ...
- 4.3 Reduction代码(Heterogeneous Parallel Programming class lab)
首先添加上Heterogeneous Parallel Programming class 中 lab: Reduction的代码: myReduction.c // MP Reduction // ...
- Parallel Programming for FPGAs 学习笔记(1)
Parallel Programming for FPGAs 学习笔记(1)
- Parallel Programming AND Asynchronous Programming
https://blogs.oracle.com/dave/ Java Memory Model...and the pragmatics of itAleksey Shipilevaleksey.s ...
- 多线程Parallel和Task
不管是Parallel还是Task,最里面都是线程池(里面是线程)当开启多个任务后,系统会根据当前的线程池的资源进行分配,任务则进行等待Parallel可以对系统的CPU进行设置,可以最大程度上榨干系 ...
随机推荐
- 1 了解Scala
1 定义变量 单个变量:var name = "benxintuzi" 等价于 var name : String = "benxintuzi"(即定义变量时 ...
- 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树
[BZOJ4026]dC Loves Number Theory Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给 ...
- 搭建Cat笔记01
昨天晚上搭建Cat 时候那叫一个坑b,宝宝心里苦呀! 准备工作: 1.先大众点评Cat的项目源码,https://github.com/dianping/cat.git 2.打包编译: mvn cle ...
- Python过滤
text = "A2A"s = filter(lambda ch: ch in '0123456789', text)print int(s)
- [闲来无事,从头再来][C51篇]导读
目 的: 通过学习C51,熟悉单片机,熟悉C语言,熟悉单片机系统的外部电路. 方 法: 通过看书和使用板子做实验来进行学习 参考资料: <新概念51单片机C语言教程& ...
- python neo4j
https://neo4j.com/developer/python/ http://debian.neo4j.org/
- JSP<jsp:forward>与<%@ include%>
JSP<jsp:forward>与<%@ include%><jsp:include> <jsp:forward file="forwardTo_p ...
- codevs1997 守卫者的挑战
题目描述 Description 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地.突 然,眼前一道亮光闪过.“我,Nizem,是黑魔法圣殿的守卫者. ...
- 介绍几款Web服务器性能压力测试工具
一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载. 但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般 ...
- 关于C++类的成员函数是否要加关键字“const”
原则:类的成员函数在小括号后大括号前加上 const ,代表不准备改变对象的数据.不加的话代表有可能会改变对象的数据. 1.当常量对象,就是加上const修饰的类的成员去调用常量成员函数时,这表示:对 ...