2011-03-05 68 views
2

對於我的一個項目來說,這是一種內容聚合器,我想介紹併發性和可能的​​並行性。首先,這似乎毫無意義,因爲併發性和並行性採用不同的方法。 (通過線程進行併發會引入即時併發,而並行則會提供潛力)。是否可以一起使用線程併發和並行?

所以爲了更好地解釋我的問題,讓我總結一下我的問題集。

由於我的項目是一個內容聚合器(聚合提要,播客和類似的東西),它基本上從網上讀取數據,解析它們以返回有意義的數據。

因此,現在我採取了一種非常簡單的順序方法。假設我們有一些我們必須解析的提要。

foreach(feed in feeds) 
{ 
    read_from_web(feed) 
    parse(feed) 
} 

因此,與順序方法花費時間解析所有的飼料和處理它們在很大程度上取決於不僅解析器代碼,但以從網絡XML源所需的時間。我們都知道,從網上閱讀信息來源可能需要不同時間(因爲網絡條件和類似問題)。所以爲了加速代碼,我可以採用一種工作線程的方法,它將引入一個立即併發;

concurrency

所以定義工作線程的數量可以採取飼料&解析同時(這將肯定加速了整個過程 - 當我們將看到的過網等待數據的影響較小) 。

這一切都好,直到我的目標受衆主要運行多核cpus - 因爲他們是遊戲玩家。

我想在處理內容時也使用這些內核,所以開始閱讀潛在的並行性http://oreilly.com/catalog/0790145310262。我還沒有完成閱讀它,並不知道這是否已經討論,但我很癡迷於此,並希望通過stackoverflow問得到一個整體的想法。

因此,作爲本書介紹潛在的並行:潛在的並行意味着你的程序是這麼寫的,它運行速度更快並行硬件可用和大致相同爲等效順序程序時,它不是

所以真正的問題是,雖然我使用工作線程的併發性,我仍然可以使用可能的並行性? (在工作線程上運行我的提要解析器,並將它們分發給cpu核心 - 如果cpu支持多核心的話當然)

+1

我實在看不出區別。當多個核心可用時工作線程並行執行 – jalf 2011-03-05 12:53:48

+0

請問有沒有可以提供給我的資源?我想詳細閱讀此內容以獲得更好的理解。 – HuseyinUslu 2011-03-05 13:12:07

+0

我與賈爾夫在此;如果某些東西並行運行,那麼它同時發生。 – 2011-03-05 13:32:24

回答

1

我認爲考慮IO綁定工作和CPU綁定工作更有用;線程可以幫助兩者。

對於IO綁定的工作,您大概正在等待外部資源(在您的情況下,要讀取的Feed)。如果你必須等待多個外部資源,那麼只能平行等待它們,而不是一個接一個地等待它們。這最好通過旋轉阻塞IO的線程來完成。

對於CPU限制的工作,你要使用所有的內核,以最大限度地完成這項工作的吞吐量。要做到這一點,您應該創建一個工作線程池,其大小與內核數量大致相同,然後分解並分配工作。 [你怎麼分手和分配工作本身就是一個有趣的問題。]

在實踐中,我發現大多數應用程序有兩個問題,它是有道理的使用線程來解決這兩種問題。

+0

看來我錯了 - 操作系統和調度程序自動將線程調度到所有可用的內核。這意味着我的工作線程將已經並行運行,以便有可用的內核。問題是爲什麼引入並行擴展?從我讀到現在爲止,在單核情況下,使用並行擴展的代碼將作爲順序執行? – HuseyinUslu 2011-03-05 13:51:39

0

好吧,似乎我受了極大的關於可並行書描述錯誤的。多虧了答案,我才能弄清楚事情;

從MSDN:http://msdn.microsoft.com/en-us/library/dd460717(VS.100).aspx

任務並行庫(TPL)是 .NET Framework中一個 組公共類型和API在 的System.Threading和 System.Threading.Tasks命名空間版本4.TPL的目的是通過 使 開發者更高效地簡化將 並行性和併發性添加到 應用程序的過程。該TPL縮放 程度的並發動態地 最有效地使用所有的 處理器可用的。在 此外,TPL處理 分區的工作,線程的線程池 的 調度,消除支持, 狀態管理,以及其他低級別 細節。通過使用TPL,你可以 同時注重您 計劃的目的是完成工作最大限度地提高您的代碼 的性能。

所以基本上這意味着TPL可以通過線程處理併發的所有細節,並支持多核並行。

相關問題