我有兩個不需要太多計算的IO密集型進程:一個是獲取並解析網頁,另一個是將通過解析獲得的一些數據存儲在數據庫中。在網絡抓取繼續進行的同時,這將會重複。動態優化線程數
是否有一種方法可以動態地增加和減少在每個任務上工作的線程數,因此對於整個系統運行的機器來說性能是最佳的?該方法不應涉及基準測試,因爲它將被分發到許多我事先無法訪問的機器。
請引導我一些來源或信息。
我有兩個不需要太多計算的IO密集型進程:一個是獲取並解析網頁,另一個是將通過解析獲得的一些數據存儲在數據庫中。在網絡抓取繼續進行的同時,這將會重複。動態優化線程數
是否有一種方法可以動態地增加和減少在每個任務上工作的線程數,因此對於整個系統運行的機器來說性能是最佳的?該方法不應涉及基準測試,因爲它將被分發到許多我事先無法訪問的機器。
請引導我一些來源或信息。
不是直接使用線程,而應該創建一個ThreadPool
,並在其中添加一些Runnable
,它們可以完成實際的工作。根據您的描述,CachedThreadPool可能是合適的。查看http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html瞭解如何實施的一些指導原則。
那麼動態調整線程數應該沒有問題(例如使用ThreadPoolExecutor)。
但它看起來對我來說,最佳線程數是由兩個因素的限制:
我不確定下載部分是否應該是多線程的,因爲每個線程只會從其他線程竊取帶寬,除非頁面非常小。
一些指南http://parsec.cs.princeton.edu/publications/iiswc62-pusukuri.pdf –
使用* ['FixedThreadPool'](http://docs.oracle.com/javase/7/docs/api /java/util/concurrent/Executors.html#newFixedThreadPool%28int%29)*,其他部分參見* [this](http://stackoverflow.com/questions/1980832/java-how-to-scale-threads -according-to-cpu-cores)* post。 –