【问题标题】:Parallel Linq over `IAsyncEnumerable`?通过`IAsyncEnumerable`并行Linq?
【发布时间】:2020-08-03 20:37:56
【问题描述】:

任何支持在 IAsyncEnumerable<T> (.NET Standard 2.1) 上使用 AsParallel 的官方或稳定的第 3 方库?

我不想用异步方法、TaskCompletionSource 或其他方法将 IAsyncEnumerable<T> 包装到 IEnumerable<Task<T>>,因为会产生额外费用。

【问题讨论】:

  • 也许你会需要这个。 nuget.org/packages/System.Linq.Async
  • @HoàngMinhThông 它确实支持 linq over IAsyncEnumerable 和异步选择器/谓词,但 Parallel Linq 是另一个主题。

标签: c# .net-core plinq iasyncenumerable .net-standard-2.1


【解决方案1】:

将并行和异步结合起来没有多大意义。并行的目的是同时使用多个处理器/内核,而异步的目的是完全不使用任何 CPU 资源。

AsParallel (PLINQ) 与 IEnumerables 一起使用,以防枚举 IEnumerable 是 CPU 密集型的。换句话说,当必须在一个 MoveNext 调用和下一个调用之间执行多对多 CPU 指令时。对于IAsyncEnumerables,延迟(通常)不是由调用MoveNextAsync 本身引起的,而是由等待返回的ValueTask 引起的。等待一个可等待对象消耗零 CPU 资源。而且您无法控制它何时完成。以Task.Delay(1000) 为例。它会在一秒钟后完成,除非你找到一种方法以某种方式弯曲spacetime,否则你不能强迫它在半秒钟内完成。 ?

【讨论】:

  • 实际上,如果您的数据源是任何类型的异步流,例如数据库分页查询,并且您正在应用的操作是 i/o 或 cpu,我认为并行和异步在一起会产生很多影响边界。例如,您想要检索数百万个 uri 的长列表,下载文件并进行一些处理:您可以在仍在检索列表的一部分时开始下载第一个,您想同时下载少数几个为了避免在 i/o 中浪费时间,并且您不能在开始处理之前缓存所有文件......这正是异步 PLINQ 会做的事情
  • @JaimeSilva 我同意。确实存在多维/异构工作负载,并且无法使用幼稚的仅并行或仅异步方法有效处理。目前,我们可用于解决此类问题的最佳工具是 TPL Dataflow 库,与优雅的 PLINQ 查询相比,它感觉有点冗长和笨拙。
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
相关资源
最近更新 更多