2010-12-17 54 views
1

該任務是 - 需要處理多個I/O流(HTTP下載),並執行一些CPU繁重的操作。理想情況下想要使用全帶寬和CPU 100%。當然,重要的CPU處理速度比網絡下載要慢。未處理的數據可以緩存到磁盤。 ASF中是否有任何現有的Executors或其他組件提供此功能?如果沒有 - 實現這一目標的最佳方法是什麼?考慮有2個線程池用於Internet-To-Disk和其他用於Disk-To-CPU-To-Disk操作。針對I/O綁定和CPU繁忙操作的Java線程同步

編輯:

我會澄清我的問題:

2線程池:Internet-To-DiskDisk-To-CPU-To-Disk是生產者/消費者的做法本身。問題是如何確保我爲producersconsumers選擇了正確的線程數?相同的代碼將在不同的盒子,不同數量的核心和不同帶寬的拱門上同步工作。如何確保我選擇了正確的線程數量,以便消耗100%的帶寬和100%的CPU?

回答

1

假設CPU的處理將是您的系統的主要瓶頸,爲CPU處理線程的數量應該是,至少,設置爲CPU或可用內核的數量。

I/O部分可能根本不會佔用太多的CPU,但您可能希望分配一個固定的少量線程池(等於或少於內核數)以防止多餘的線程上下文切換用於同時I/O流。

您也可以對CPU處理的線程數設置爲一個數字比內核數量稍微大一點,如果你的CPU處理線程並不總是使用CPU的100%,從開始到結束。例如,如果他們可能在處理過程中執行一些I/O或訪問某個共享資源。

但是與任何系統一樣,線程的理想數量將很大程度上取決於程序的性質。您可以使用JVisual VM(與JDK捆綁在一起)等工具分析程序中的線程使用情況,並嘗試使用不同的線程設置變體。

0

您可以使用producer-consumer達到此目的。根據需要儘可能多地使用生產者和消費者來滿足需求。

+0

好了,這個想法是加載帶寬和CPU儘可能的(這不是一個問題,即幾個工作周後(數以億計的HTML頁面應該被下載)下載將停止,只有CPU的處理將繼續基本上 - 問題導致 - 如何平衡兩個池(或生產者/消費者)完全加載100%的系統。如何自動找到該餘額的正確數量的線程? – Archer 2010-12-17 19:04:24

0

如果您的CPU階段比下載時間更密集,爲什麼不只是下載數據,因爲您可以處理它。這樣你就可以擁有多個Internet到CPU到磁盤的進程。跳過舞臺可能會更快,而且它肯定會更簡單。

0

我會去一個生產者 - 消費者結構:一個線程池來處理數據(由ExecutorService的管理),以及一個或多個線程從互聯網上下載的數據。

要處理的數據將被放入有界阻塞隊列(例如LinkedBlockingQueue),以便下載線程只在需要時(即計算線程能夠處理新數據時)獲取數據。另外,這種結構保證了線程安全和內存發佈。

+0

如果你有線程完成下載和處理,你永遠不會有太多的下載或處理線程在等待對方。 – 2010-12-17 13:14:48

+0

等待將新項目放入阻塞隊列的權限的線程進入WAITING模式;它們很便宜,並且不消耗任何CPU時間。爲了架構的清晰起見,我寧願有兩個不同的池,一個用於下載器,一個用於數據處理:每個池都可以獨立配置和調整。自我餵養的「生產者 - 消費者」模式是......很奇怪。 – 2010-12-17 13:22:15