【问题标题】:Are these two code snippets using IQueryable and .AsParallel equivalent?这两个使用 IQueryable 和 .AsParallel 的代码片段是否等效?
【发布时间】:2015-04-20 17:22:50
【问题描述】:

我正在编写一些非常基本的 TPL 代码,我遇到了一种情况,我很好奇以下两个 sn-ps 是否等效:

myEnumerable.AsParallel().Select(e =>
{
    //do some work that takes awhile
    return new Thing(e);
}

myEnumerable.Select(e =>
{
    //do some work that takes awhile
    return new Thing(e);
}.AsParallel()

另外 - 如果它们实际上是等价的,那么它们的等价性是否可以按照 TPL 接口与 IEnumerable 扩展方法的定义进行更改?还是我只是设置自己在更新到 .NET V{Whatever} 时破坏我的代码?

对于背景,myEnumerable 是一个我尚未枚举(进行数据库往返)的 EF 表(实体)。

我想要的行为是同步进行 DB 调用,取回一个 List,并并行操作该列表(在 List 上并行进行一堆 Web 服务调用)

【问题讨论】:

  • 想解释一下否决票以便我改进问题?

标签: c# entity-framework parallel-processing task-parallel-library


【解决方案1】:

我很好奇以下两个sn-ps是否等价

不,他们不是。您之前的代码将尝试IEnumerable 进行分区,以便并行执行它。您后面的代码将按顺序将元素投射到您的Select,并接收过滤后的IEnumerable。只有AsParallel 之后的内容才会并行运行。

请注意,LINQ-To-Entities 不适用于AsParallel。通常,它会导致您的代码运行速度较慢,然后按顺序运行。此外,DbContext 不是线程安全的。该代码可能会造成弊大于利。

你可以做的是首先查询数据库,一旦数据在内存中,使用AsParallel

我想要的行为是同步进行 DB 调用,得到一个 返回列表,并在列表上并行操作(制作一堆web List 上的服务调用并行)

如果您想通过返回的数据进行多个 Web 服务调用,您可以利用现有的自然异步 API 来发出此类请求。例如,如果您正在查询 HTTP 端点,则可以利用 HttpClient 并将其与 async-await 结合使用,并同时执行查询,而无需任何额外线程。

【讨论】:

  • 不幸的是,我没有可用的 async-await(万岁遗留系统和过时的编码标准),但我可能能够拼凑出一些可以像这样工作的东西。我会试一试并在几分钟内更新,谢谢!
  • 您正在开发哪个版本的 .NET 框架?
  • 4.0,但我不允许使用 async/await,因为经理担心未来的工程师不会理解它是如何工作的。
  • 一件事 - 请您添加“只有 AsParallel 之后的内容是并行的”。 @usr 包含在下面的块?这有助于我更好地理解发生了什么。
  • 是的,这是我一直在使用的东西。不幸的是,咨询有时会对您强制执行一组非常有趣的规则;)
【解决方案2】:

只有AsParallel 之后的内容是并行的。它之前的所有内容都只是并行查询的顺序输入流(例外:如果输入已经是并行查询,它将被视为这样)。

PLINQ 无法并行化现有查询,因为它无法剖析它。输入是不透明的IEnumerable

我想要的行为是同步进行 DB 调用,取回一个 List,然后并行操作该列表

使用第一个代码sn-p。

在 List 上并行调用一堆 Web 服务

TPL 在为 IO-bound 任务选择最佳并行度方面很糟糕。使用 WithDegreeOfParallelism 为您的特定 IO 负载选择合适的 DOP。

【讨论】:

  • 我不相信我在使用 PLINQ - 只是 LINQ 实体。除非 PLINQ 在使用 TPL 时免费提供?
  • @Pheonixblade9 PLINQ 代表“Parallel LINQ”,它是使用 TPL(任务并行库)实现的。当您使用AsParallel 时。您正在使用 PLINQ。
  • 我知道 PLINQ 是什么 :) 我只是不知道它是否在使用 TPL 时自动出现。谢谢!
【解决方案3】:

不,它们不相等。

第一个表达式将在使用时并行运行Select 中的工作。

第二个表达式将在一个线程中运行Select 中的工作,以生成并行执行的项目。您使用第二个表达式所做的操作将并行运行,但这可能是一些微不足道的事情,不会从并行化中受益。

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多