请解释什么是并发和并行(认识并发与并行)
请解释什么是并发和并行(认识并发与并行)并行一定是并发的,并发不一定并行。异步不一定多线程。总结一句话:并行:多个人一次做同一件事当某件事太复杂了而且可以拆开单独执行的时候,你可以拆成几个部分同步执行,这时候你可以使用并行。一般来讲数据密集型相关的应用选择并行,并行主要是利用CPU多核心,同时计算运行。
悟
并发:一个人一次做多件事
当你需要一个应用程序在做一件事的同时去做另外一件事的时候你需要并发。几乎世界上所有的软件应用程序都可以从并发中受益。
一般来讲IO相关的选择并发 多线程的话当某个线程在做IO的时候另外一个线程可以在同一个CPU核心上(也有可能在不同核心上)执行另外的工作。
并行:多个人一次做同一件事
当某件事太复杂了而且可以拆开单独执行的时候,你可以拆成几个部分同步执行,这时候你可以使用并行。
一般来讲数据密集型相关的应用选择并行,并行主要是利用CPU多核心,同时计算运行。
总结一句话:
并行一定是并发的,并发不一定并行。异步不一定多线程。
并发的场景:
1、维护响应式用户界面(异步方法也可以做到而且异步不一定开启新线程)
其主线程负责用户界面元素并响应用户操作。 使用工作线程执行耗时的操作(这些操作会占用主线程并使用户界面无响应)
2、可以使用专用线程,提高网络或设备通信对传入消息或事件的响应能力
并行的场景:
1、有效地使用阻塞的 CPU
当线程等待另一台计算机或硬件的响应时,多线程处理非常有用。当一个线程在执行任务时被阻塞时,其他线程可以利用原本没有负担的计算机
2、并行程序设计
如果工作负载以“分治”策略在多个线程之间共享,那么执行密集计算的代码可以在多核或多处理器计算机上更快地执行
3、随机执行
在多核机器上,您有时可以通过预测可能需要完成的事情,然后提前完成它来提高性能。
使用这种技术来加速新查询的创建。一种变化是运行一些不同的算法并行,所有解决相同的任务。当你不能提前知道哪个算法执行得最快的时候,这种方法是有效的
4、如果程序执行可并行执行的操作,可通过在多个线程中执行这些操作并在多处理器或多核系统中运行程序减少总执行时间。
在此类系统中,使用多线程处理可能会提高吞吐量和响应能力
推荐用法:
使用多线程的推荐方法是使用任务并行库 (TPL) 和并行 LINQ (PLINQ)
TPL 和 PLINQ 依赖于 ThreadPool 线程。 System.Threading.ThreadPool 类为 .NET 应用程序提供工作线程池。
任务并行库 (TPL) 是 System.Threading 和 System.Threading.Tasks 空间中的一组公共类型和 API。
TPL 的目的是通过简化将并行和并发添加到应用程序的过程来提高开发人员的工作效率。 TPL 动态缩放并发的程度以最有效地使用所有可用的处理器。 此外,TPL 还处理工作分区、ThreadPool 上的线程调度、取消支持、状态管理以及其他低级别的细节操作。 通过使用 TPL,你可以在将精力集中于程序要完成的工作,同时最大程度地提高代码的性能。
TPL包含:
1、数据并行( Parallel.For 或 Parallel.ForEach)
任务并行库 (TPL) 支持通过 System.Threading.Tasks.Parallel 类实现的数据并行。此类对 for 循环和 foreach 循环提供了基于方法的并行执行。
2、基于任务的异步编程
使用 Parallel.Invoke 隐式创建和运行任务,或通过直接使用 Task 对象显式创建和运行任务。
3、数据流DataFlow
使用 TPL 数据流库中的数据流组件处理多项运算,这些运算必须彼此通信,或在数据可用时处理数据。
参考:.NET 中的并行编程 | Microsoft Docs