代码之家  ›  专栏  ›  技术社区  ›  Joel Mueller

F:异步、任务和PLINQ,噢,天哪!

  •  8
  • Joel Mueller  · 技术社区  · 14 年前

    当f出来的时候,我将在异步/并行编程领域中遇到财富的尴尬。安 answer to this question 在描述任务、并行LINQ和反应式框架之间的差异方面做得很好,但是我想知道异步工作流是如何准确地融入到图片中的。

    如果我错了,请纠正我,但据我所知,异步工作流将是处理IO绑定操作的最简单方法,特别是那些定义了AsynchXXX方法的操作,或遵循BeginXXX/EndXXX模式的操作。另一个优点是异步工作流是可组合的,并且可以用其他异步工作流构建——这样可以在程序的结构上提供很大的灵活性。

    我想我需要帮助的是理解在什么情况下,我会选择任务或PLINQ而不是异步工作流(在F代码中)。我相信我读到了任务并行库有更复杂的方法来平衡跨核心的负载。如果这是真的,那么对于需要并行操作的纯CPU绑定操作来说,任务可能是更好的选择。另一方面,plinq似乎主要是一种并行处理序列的现有代码的方便方法。

    最后,假设我对每种方法的优点的理解是正确的,那么将它们结合起来是可能的还是明智的?例如,也许可以从异步工作流中组合一系列操作,然后在执行之前将它们转换为任务。如果可能的话,甚至是一个好主意。

    2 回复  |  直到 14 年前
        1
  •  12
  •   Community dbr    7 年前

    Task Parallel Library vs Async Workflows .

    我将把基本知识总结如下:

    任务并行库 :允许多个工作单元在多个核心上高效运行,包括相对简单的场景,例如生成多个线程并行执行类似的计算,以及更复杂的操作,其中计算本身也最终生成其他任务。使用改进的.NET 4.0线程池和工作窃取队列来确保所有核心都处于繁忙状态。

    异步工作流 :允许异步计算在不占用不需要的线程的情况下运行,并在结果可用时启动回调。

    普林克 :使用plinq编写的代码最终通过tpl运行,但对于使用linq查询轻松表示的代码来说,这是一个更好的接口(例如,对数据数组中的每个项目并行执行单个操作)。

    请注意,异步工作流可以使用 StartAsTask 方法和任务可以转换为 Async S使用 Async.AwaitTask 方法,因此可以桥接这些技术,尽管它们的目标场景略有不同。

    对我来说,经验法则是,如果你在不同的线程上进行大量的计算,你会想要使用tpl(可能通过plinq或f等价物,如pseq模块),而如果你试图做大量的IO(无论是否并行),你应该使用异步工作流。 因此,光线跟踪器将使用tpl启动任务,并行渲染每个像素(或扫描线),最大限度地提高计算机的可用计算能力。 但是,由于没有太多的计算可以在核心之间传播,下载大量的网页将通过异步工作流完成;当结果出现时,操作系统只需要通知您。

        2
  •  1
  •   Robert    14 年前

    异步工作流是通过F_monadic语法实现的。这意味着,您可以编写自己的基于并行任务库的“异步”版本,而不是将工作流转换为任务。我说这个有几个警告:

    • 这很难做到。
    • 在.NET中使用beginxxx/endxxx模式的异步操作在线程池中注册回调。我不确定您是否可以更改此项,以改为使用任务重定向它们。

    有关如何在f_中实现monad的更多详细信息,请参阅“专家f_”一书或在“f_monads”上搜索一点。

    我知道答案不完整,但希望能有所帮助。