任务并行库 - 单核上的并行性

时间:2012-08-27 10:25:41

标签: c# .net task-parallel-library

我正在研究WPF应用程序 在屏幕/视图中,我必须对WCF服务进行6次调用。这些调用中没有一个是相关的,因为它们不共享数据,也不相互依赖。我打算使用TPL并将这6个WCF服务调用作为6个任务。现在,应用程序可以部署在单个核心机器上,也可以部署在多个核心机器上。

我被告知在单核机器上使用TPL实际上会增加完成任务所需的时间,因为cpu调度程序会花费很多时间来拼接不同的任务。这是真的。如果是的话,我还应该继续我的设计,还是应该考虑其他选择。

如果我必须看看替代品,那些替代品是什么:)?

3 个答案:

答案 0 :(得分:5)

在执行CPU密集型操作时,您将通过在单个核心计算机上运行并行线程来增加开销。

在您的情况下,任务不是CPU密集型的,他们正在等待服务调用来响应,因此您可以在单个核心机器上运行并行线程。

根据服务器处理呼叫的方式,可能无论如何都不会有任何时间增加。如果呼叫在服务器上排队,则无论如何都需要大约相同的时间来运行所有呼叫。在这种情况下,最好按顺序运行调用,因为它更简单。

答案 1 :(得分:3)

您最好的选择是使用多核和单核进行配置。大多数bios可以设置活动核心的数量,因此它不应该是一个大问题。你可以做一些模拟测试,看看它是否适合你。

显然使用任务切换会产生开销问题,但只要每个任务的时间比设置时间长,你就不会注意到它。

有很多方法可以实现多任务行为,如果您不知道哪种方法最好,那么您可能需要实际编写一些测试用例并进行一些分析。这并不难做到。如果您只是尝试使用多核系统,那么使用最新版本的.NET通常很容易,您甚至可以将其设置为多核,但可以通过使用适当的结构恢复为单核。

例如,通过使用#ifdef或删除所有等待关键字(使用搜索和替换工具),可以轻松地同步运行async / await模式。 Parallel.For循环可以直接或通过更改for轻松转换为普通MaxDegreeOfParallelism循环。可以轻松地同步运行任务。

如果您想让它更透明,您可以使用一些预处理脚本,如T4。

答案 2 :(得分:1)

一般情况下,当在单核上运行多线程时,它会更慢,因为它在线程之间有上下文切换。

我认为下图将向您解释差异:

Context Switch

正如您所看到的,图表是指在单核上运行的4个线程,第一次是多任务处理,第二次是Sequential。

你可以看到,在多任务处理中,所有线程都会在顺序任务之后完成。

在你的具体案例中可能不会相同,我认为@Guffa在答案中是正确的,因为它涉及WCF调用