簡體   English   中英

.Net中可用的並行技術

[英]Available parallel technologies in .Net

我是.Net平台的新手。 我做了一個搜索,發現有幾種方法可以在.Net中進行並行計算:

  1. 任務並行庫中的並行任務,即.Net 3.5。

  2. PLINQ,.Net 4.0

  3. Asynchounous Programming,.Net 2.0,(async主要用於執行I / O繁重的任務,F#有一個簡潔的語法支持這一點)。 我列出這個是因為在Mono中,似乎沒有TPL或PLINQ。 因此,如果我需要編寫跨平台並行程序,我可以使用異步。

  4. .Net線程。 沒有版本限制。

您能否對這些做一些簡短評論或在此列表中添加更多方法?

您需要做大量的研究才能確定如何有效地進行多線程。 有一些很好的技術文章 ,是Microsoft Parallel Computing團隊網站的一部分

在我的腦海中,有幾種方法可以解決多線程問題:

  1. Thread類。
  2. ThreadPool ,它還支持I / O綁定操作和I / O完成端口。
  3. Begin* / End*異步操作。
  4. 基於事件的異步編程(或“EBAP”)組件,它們使用SynchronizationContext
  5. BackgroundWorker ,它是定義異步操作的EBAP。
  6. .NET 4中的Task類(任務並行庫)。
  7. 並行LINQ。 關於Parallel.ForEach(任務並行庫)與PLINQ的文章很好
  8. Rx或“LINQ to Events”,它還沒有非Beta版本,但接近完成並且看起來很有希望。
  9. (僅限F#)異步工作流程。

更新:有一篇文章了解和應用.NET Framework 4的並行模式可供下載,它為哪些解決方案用於哪種並行方案提供了一些指導(盡管它假定為.NET 4並且不包括Rx)。

嚴格來說,應該在這里區分並行,異步和並發。

並行意味着“任務”被分成幾個可以同時運行的較小子任務。 這需要一個多核CPU或多CPU計算機,其中每個任務都有其專用的核心或CPU。 或多台電腦。 PLINQ(數據並行)和TPL(任務並行)屬於這一類。

異步意味着任務在不相互阻塞的情況下運行。 F#的異步表達式,Rx,Begin / End模式都是異步編程的API。

並發是一個比並行化和異步更廣泛的概念。 並發意味着幾個“任務”同時運行,彼此交互。 但是這些“任務”不必在單獨的物理計算單元上運行,就像在並行化中那樣。 例如,多任務操作系統甚至可以使用時間片在單核單CPU計算機上同時執行多個進程。 並發可以通過例如Actor模型和消息傳遞來實現(例如F#的郵箱,Erlang進程(在.Net中的Retlang))

與上述概念相比,線程是一個相對低級的概念。 線程是在進程內運行的任務,並行運行並由操作系統的調度程序直接管理。 當操作系統通過在每個線程上實現消息隊列,路由等將每個線程映射到單獨的核心或Actor模型時,可以實現並行化。

還有一些用於數據並行編程的.NET庫,它們以圖形處理單元(GPU)為目標,包括:

Microsoft Accelerator用於數據並行編程,可以針對GPU或多核處理器。

Brama用於在GPU上運行的LINQ樣式數據轉換。

CUDA.NET提供了一個包裝器,允許從.NET程序中使用CUDA。

還有.NETReactive Extensions(Rx)

Rx基本上是事件的linq查詢。 它允許您以與linq允許您使用集合相同的方式處理和組合異步數據流。 因此,您可能會將其與其他並行技術結合使用,作為將並行操作的結果集中在一起的方法,而不必擔心鎖和其他低級線程原語。

專家專家:Brian Beckman和Erik Meijer - .NET Reactive Framework(Rx)內部概述了Rx的全部內容。

編輯:值得一提的另一個庫是並發和協調運行時(CCR),它已存在很長時間(早於'06)並作為Microsoft Robotics Studio的一部分提供。

Rx有很多與CCR相同的很酷的想法,但在我看來,它有更好的API。 CCR中仍然有一些有趣的東西,所以它可能值得一試。 還有一個與CCR一起使用的分布式服務框架,可能會根據您正在做的事情使其有用。

專家專家:Meijer和Chrysanthakopoulos - 並發,協調和CCR

還有一個是.NET 4.0中的新任務並行庫,它與您已經發現的類似,但這可能是一個有趣的讀物:

任務並行庫

並行的兩種主要方式是線程和基於新任務的庫TPL。

您提到的異步編程只不過是線程池中的一個新線程。

提到的PLINQ,Rx和其他實際上是位於新任務調度程序頂部的擴展。

最好的文章完全解釋了新任務調度程序的新架構及其上面的所有庫,Visual Studio 2010和新的TPL .NET 4.0基於任務的並行機構(由Microsoft的並行開發人員工具產品部經理Steve Teixeira撰寫) ):

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

否則Dobbs博士在這里有專門的並行編程部分: http//www.drdobbs.com/go-parallel/index.jhtml

說線程和基於新任務的並行編程之間的主要區別在於您不需要再考慮線程,如何管理池以及底層操作系統和硬件。 TPL負責您只使用任務。 這是您在任何級別(包括抽象)上進行並行操作的方式的巨大變化。

所以在.NET中實際上你沒有很多選擇:

  1. 基於新任務的任務調度程序。

顯然,任務基礎是要走的路。

歡呼Valko

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM