gpt4 book ai didi

c# - 是否可以同时使用线程并发和并行?

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:37 24 4
gpt4 key购买 nike

对于我的一个项目,这是一种内容聚合器,我想引入并发性,如果可能的话,还可以引入并行性。乍一看,这似乎毫无意义,因为并发性和并行性采用不同的方法。 (通过线程的并发引入了立即并发,而并行性提供了潜力)。

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

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

所以现在我采用了一种非常简单的顺序方法。假设我们有一定数量的提要需要解析。

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

因此,采用顺序方法解析所有提要并处理它们所花费的时间在很大程度上不仅取决于解析器代码,还取决于从 Web 获取 xml 源代码所需的时间。我们都知道从网络上读取源代码可能需要不同的时间(由于网络条件和类似问题)。

因此,为了加快代码速度,我可以采用工作线程的方法,这将引入即时并发;

concurrency

因此,一定数量的工作线程可以同时接收数据和解析(这肯定会加快整个过程 - 因为我们会看到通过网络等待数据的影响较小)。

这一切都很好,直到我的项目目标受众大多运行多核 cpus——因为他们是游戏玩家——这一事实。

我还想在处理内容时利用这些核心,因此开始阅读潜在的并行性 http://oreilly.com/catalog/0790145310262 .我还没有读完它,不知道是否已经讨论过,但我对此有点着迷,想通过 stackoverflow 了解一个整体想法。

因此,正如书中描述的潜在并行性:潜在并行性意味着您编写的程序使其在并行硬件可用运行得更快并且大致相同作为等效的顺序程序当它不是时。

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

最佳答案

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

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

对于 CPU 密集型工作,您希望使用所有核心来最大化完成该工作的吞吐量。为此,您应该创建一个与核心数量大致相同大小的工作线程池,然后分解并在它们之间分配工作。 [如何分解和分配工作本身就是一个有趣的问题。]

在实践中,我发现大多数应用程序都存在这两种问题,使用线程来解决这两种问题是有意义的。

关于c# - 是否可以同时使用线程并发和并行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5203871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com