并行编程的使用场景:须要执行大量的计算任务,而且这些任务能分割成相互独立的任务块儿编程
并行的形式有两种:数据并行(data parallelism)和任务并行(task parallelim)。promise
数据并行(data parallelism):有大量的数据须要处理,而且每一块数据的处理过程基本上是彼此独立的。服务器
任务并行(task parallelim):须要执行大量任务,而且每一个任务的执行过程基本上是彼此独立的。任务并行能够是动态的,若是一个任务的执行结果会产生额外的任务,这些新增的任务也能够加入任务池。多线程
实现数据并行的方法并发
每一个任务块要尽量的互相独立。 只要任务块是互相独立的,并行性就能作到最大化。一旦你在多个线程中共享状态,就必须以同步方式访问这些状态,那样程序的并行性就变差了。异步
数据并行重点在处理数据,任务并行则关注执行任务。async
实现任务并行的方法函数式编程
一般状况下,不必关心线程池处理任务的具体作法。数据并行和任务并行都使用动态调整的分割器,把任务分割后分配给工做线程。线程池在须要的时候会增长线程数量。线程池线程使用工做窃取队列(work-stealing queue)。异步编程
使用场景:处理的事件中带有参数,最好采用响应式编程
响应式编程的核心概念是:可观察的流(observable stream)
响应式编程的最终代码很是像 LINQ,能够认为它就是“LINQ to events”,它采用“推送”模式,事件到达后就自行穿过查询。函数
异步编程和并行编程这两种技术结合起来就是TPL数据流
数据流网格的基本组成单元是数据流块(dataflow block)。
Rx 和 TPL有不少相同点。
网格和流都有“数据项”这一律念,数据项从网格或流的中间穿过。还有,网格和流都有“正常完成”(表示没有更多数据须要接收时发出的通知)和“不正常完成”(在处理数据中发生错误时发出的通知)这两个概念。可是,Rx 和 TPL 数据流的性能并不相同。
当须要执行须要计时的任务,最佳选择是Rx的 可观察流 observable 对象
当须要进行并行处理,最佳选择是 TPL数据流块
线程是一个独立的运行单元,每一个进程内部有多个线程,每一个线程能够各自同时执行指令。每一个线程有本身独立的栈,可是与进程内的其余线程共享内存。
对某些程序来讲,其中有一个线程是特殊的,例如用户界面程序有一个 UI 线程,控制台程序有一个 main 线程。
每一个 .NET 程序都有一个线程池,线程池维护着必定数量的工做线程,这些线程等待着执行分配下来的任务。线程池能够随时监测线程的数量。配置线程池的参数多达几十个,可是建议采用默认设置,线程池的默认设置是通过仔细调整的,适用于绝大多数现实中的应用场景。
大多数并发编程技术有一个相似点:它们本质上都是函数式(functional)的。函数式编程理念是并发编程的本质。