2011-03-05 69 views
2

对于我的一个项目来说,这是一种内容聚合器,我想介绍并发性和可能的​​并行性。首先,这似乎毫无意义,因为并发性和并行性采用不同的方法。 (通过线程进行并发会引入即时并发,而并行则会提供潜力)。是否可以一起使用线程并发和并行?

所以为了更好地解释我的问题,让我总结一下我的问题集。

由于我的项目是一个内容聚合器(聚合提要,播客和类似的东西),它基本上从网上读取数据,解析它们以返回有意义的数据。

因此,现在我采取了一种非常简单的顺序方法。假设我们有一些我们必须解析的提要。

foreach(feed in feeds) 
{ 
    read_from_web(feed) 
    parse(feed) 
} 

因此,与顺序方法花费时间解析所有的饲料和处理它们在很大程度上取决于不仅解析器代码,但以从网络XML源所需的时间。我们都知道,从网上阅读信息来源可能需要不同时间(因为网络条件和类似问题)。所以为了加速代码,我可以采用一种工作线程的方法,它将引入一个立即并发;

concurrency

所以定义工作线程的数量可以采取饲料&解析同时(这将肯定加速了整个过程 - 当我们将看到的过网等待数据的影响较小) 。

这一切都好,直到我的目标受众主要运行多核cpus - 因为他们是游戏玩家。

我想在处理内容时也使用这些内核,所以开始阅读潜在的并行性http://oreilly.com/catalog/0790145310262。我还没有完成阅读它,并不知道这是否已经讨论,但我很痴迷于此,并希望通过stackoverflow问得到一个整体的想法。

因此,作为本书介绍潜在的并行:潜在的并行意味着你的程序是这么写的,它运行速度更快并行硬件可用和大致相同为等效顺序程序时,它不是

所以真正的问题是,虽然我使用工作线程的并发性,我仍然可以使用可能的并行性? (在工作线程上运行我的提要解析器,并将它们分发给cpu核心 - 如果cpu支持多核心的话当然)

+1

我实在看不出区别。当多个核心可用时工作线程并行执行 – jalf 2011-03-05 12:53:48

+0

请问有没有可以提供给我的资源?我想详细阅读此内容以获得更好的理解。 – HuseyinUslu 2011-03-05 13:12:07

+0

我与贾尔夫在此;如果某些东西并行运行,那么它同时发生。 – 2011-03-05 13:32:24

回答

1

我认为考虑IO绑定工作和CPU绑定工作更有用;线程可以帮助两者。

对于IO绑定的工作,您大概正在等待外部资源(在您的情况下,要读取的Feed)。如果你必须等待多个外部资源,那么只能平行等待它们,而不是一个接一个地等待它们。这最好通过旋转阻塞IO的线程来完成。

对于CPU限制的工作,你要使用所有的内核,以最大限度地完成这项工作的吞吐量。要做到这一点,您应该创建一个工作线程池,其大小与内核数量大致相同,然后分解并分配工作。 [你怎么分手和分配工作本身就是一个有趣的问题。]

在实践中,我发现大多数应用程序有两个问题,它是有道理的使用线程来解决这两种问题。

+0

看来我错了 - 操作系统和调度程序自动将线程调度到所有可用的内核。这意味着我的工作线程将已经并行运行,以便有可用的内核。问题是为什么引入并行扩展?从我读到现在为止,在单核情况下,使用并行扩展的代码将作为顺序执行? – HuseyinUslu 2011-03-05 13:51:39

0

好吧,似乎我受了极大的关于可并行书描述错误的。多亏了答案,我才能弄清楚事情;

从MSDN:http://msdn.microsoft.com/en-us/library/dd460717(VS.100).aspx

任务并行库(TPL)是 .NET Framework中一个 组公共类型和API在 的System.Threading和 System.Threading.Tasks命名空间版本4.TPL的目的是通过 使 开发者更高效地简化将 并行性和并发性添加到 应用程序的过程。该TPL缩放 程度的并发动态地 最有效地使用所有的 处理器可用的。在 此外,TPL处理 分区的工作,线程的线程池 的 调度,消除支持, 状态管理,以及其他低级别 细节。通过使用TPL,你可以 同时注重您 计划的目的是完成工作最大限度地提高您的代码 的性能。

所以基本上这意味着TPL可以通过线程处理并发的所有细节,并支持多核并行。

相关问题