代码之家  ›  专栏  ›  技术社区  ›  Yin Zhu

.NET中可用的并行技术

  •  10
  • Yin Zhu  · 技术社区  · 15 年前

    我是.NET平台的新手。我搜索了一下,发现在.NET中有几种并行计算的方法:

    1. 任务并行库中的并行任务,即.NET 3.5。

    2. 网4

    3. 异步编程,.NET 2.0,(异步主要用于执行I/O繁重的任务,f有一个简洁的语法支持这一点)。我列出这个是因为在mono中,似乎没有tpl或plinq。因此,如果我需要编写跨平台并行程序,我可以使用异步。

    4. NET线程。无版本限制。

    你能对这些做些简短的评论吗,或者在这个列表中添加更多的方法?

    6 回复  |  直到 7 年前
        1
  •  15
  •   Stephen Cleary    15 年前

    为了确定如何有效地执行多线程,您确实需要进行大量的研究。有一些好的 technical articles 的一部分 Microsoft Parallel Computing team's site .

    在我的头上,有几种方法可以进行多线程处理:

    1. Thread 班级。
    2. ThreadPool
    3. Begin* / End* 异步操作。
    4. 基于事件的异步编程(或“ebap”)组件,使用 SynchronizationContext .
    5. BackgroundWorker ,这是定义异步操作的ebap。
    6. Task .NET 4中的类(任务并行库)。
    7. 并行LINQ有一个 good article 在parallel.foreach(任务并行库)与plinq上。
    8. Rx 或者是“LinqToEvents”,它还没有非测试版,但已经接近完成,看起来很有希望。
    9. (仅限F)异步工作流。

    更新:有篇文章 Understanding and Applying Parallel Patterns with the .NET Framework 4 可供下载,提供了某些方向的解决方案,可用于哪些类型的并行方案(尽管它假定.NET 4,不包括RX)。

        2
  •  11
  •   Mauricio Scheffer    15 年前

    严格来说,这里应该区分并行、异步和并发。

    并行意味着一个“任务”被分成几个较小的子任务,这些子任务可以同时运行。这需要多核CPU或多CPU计算机,其中每个任务都有其专用的核心或CPU。或多台计算机。plinq(数据并行)和tpl(任务并行)属于此类。

    异步意味着任务运行时不会相互阻塞。f的异步表达式、rx、开始/结束模式都是异步编程的API。

    并发性是一个比并行和异步更广泛的概念。 并发性意味着几个“任务”同时运行,彼此交互。但这些“任务”不必运行在单独的物理计算单元上,这在并行化中是有意义的。例如,多任务操作系统可以使用时间片在单核单CPU计算机上同时执行多个进程。 例如,可以通过actor模型和消息传递(例如f的邮箱、erlang进程(retlang in.net))实现并发性。

    与上面的概念相比,线程是一个相对低级的概念。线程是在进程内运行的任务,同时运行,由操作系统的调度程序直接管理。当操作系统通过在每个线程上实现消息队列、路由等,将每个线程映射到单独的核心或参与者模型时,可以实现并行化。

        3
  •  4
  •   Paul Dixon    15 年前

    还有一些面向图形处理单元(GPU)的.NET数据并行编程库,包括:

    Microsoft Accelerator 用于数据并行编程,可以针对GPU或多核处理器。

    Brama 用于在GPU上运行的LINQ样式的数据转换。

    CUDA.NET 提供允许从.NET程序使用CUDA的包装。

        4
  •  3
  •   Jacob Stanley    15 年前

    还有 Reactive Extensions for .NET (Rx)

    RX基本上是事件的LINQ查询。它允许您以LINQ允许您处理集合的相同方式处理和组合异步数据流。因此,您可能会将它与其他并行技术结合使用,将并行操作的结果结合在一起,而不必担心锁和其他低级线程原语。

    Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) 很好地概述了RX的意义。

    编辑: 另一个值得一提的库是并发和协调运行时(ccr),它已经存在很长时间了(早于06年),并作为 Microsoft Robotics Studio .

    RX有很多和CCR一样酷的想法,但在我看来,它有一个更好的API。不过,中央控制室里还有一些有趣的东西,所以可能值得一看。还有一个分布式服务框架可以与CCR一起工作,这可能会使它变得有用,这取决于您正在做什么。

    Expert to Expert: Meijer and Chrysanthakopoulos - Concurrency, Coordination and the CCR

        5
  •  2
  •   dreadwail    15 年前

    另一个是.NET 4.0中的新任务并行库,它与您已经发现的内容类似,但这可能是一本有趣的书:

    Task Parallel Library

        6
  •  -1
  •   Valko    15 年前

    两种主要的并行方法是线程和新的基于任务的库TPL。

    您提到的异步编程只不过是线程池中的一个新线程。

    plinq、rx和其他提到的实际上是位于新任务调度程序顶部的扩展。

    这里有一篇最好的文章,它精确地解释了新的任务调度程序和它上面的所有库、Visual Studio 2010和新的TPL.NET 4.0基于任务的并行性的新体系结构(由微软并行开发工具产品单元经理Steve Teixeira撰写):

    http://www.drdobbs.com/visualstudio/224400670

    否则,Dobbs博士在这里有专门的并行编程部分: http://www.drdobbs.com/go-parallel/index.jhtml

    say线程和新的基于任务的并行编程之间的主要区别在于,您不再需要考虑线程、如何管理池、底层操作系统和硬件。TPL负责你只使用任务。这是您在任何级别(包括抽象)上并行操作方式的巨大变化。

    所以在.NET中,实际上您没有很多选择:

    1. 螺纹
    2. 新的基于任务的任务调度程序。

    显然,基于任务的方法是可行的。

    干杯 瓦尔科

    推荐文章