編輯:這個問題可能適用於其他語言 - 背後的整體理論似乎主要是語言不可知的。但是,因爲這將在JVM中運行,所以我確定JVM開銷/線程與其他環境之間存在差異。爲了澄清一點,我想主要的問題是哪個更適合可伸縮性:具有更小的線程可以更快地返回,以便爲其他工作負載處理其他工作塊,或嘗試獲取儘可能快地完成單個工作量?在這種情況下,工作負載是連續的,多線程無助於加速單個工作單元;它更希望提高整個系統的吞吐量(感謝Uri帶領我澄清)。Java多線程 - 更少的線程或更少的線程做更多的線程?
我正在開發一個替換現有系統的系統;目前的系統負載相當沉重,所以我們已經知道替換需要高度可擴展性。它與幾個外部進程進行通信,如電子郵件,其他服務,數據庫等,我已經計劃使它成爲多線程來幫助擴展。我以前在多線程應用程序上工作過,沒有任何性能/可伸縮性需求的高點,所以我沒有太多經驗來獲得絕對最大的併發性。
我的問題是在線程之間分配工作的最好方法是什麼?我在看兩個不同的版本,一個爲完整的工作流創建一個線程,另一個爲每個單獨的步驟創建一個線程,繼續下一步(在新的/不同的線程中)步驟完成 - 可能使用NodeJS風格的回調系統,但不直接關注直接實現細節。
我不太瞭解多線程的基本細節 - 例如上下文切換等,所以我不知道多線程的開銷是否會縮短每個線程的執行時間。一方面,與多線程相比,單線程模型似乎對單個工作流程來說是最快的;然而,它也會爲整個工作流程綁定一個線程,而多線程會更短,並且會更快地返回池(至少我想)。
希望底層的概念很容易理解;這裏是一個人爲的僞代碼示例,但:
// Single-thread approach
foo();
bar();
baz();
或者:
// Multiple Thread approach
Thread.run(foo);
when foo.isDone()
Thread.run(bar);
when bar.isDone()
Thread.run(baz);
UPDATE:完全忘了。我正在考慮多線程方法的原因是(可能錯誤地)認爲,由於線程執行時間較短,因此它們可用於整個工作負載的其他實例。如果每個操作需要5秒鐘,那麼單線程版本會鎖定一個線程15秒;多線程版本會鎖定單個線程5秒鐘,然後它可以用於另一個進程。
任何想法?如果在網頁中有任何類似的內容,我甚至會喜歡這個鏈接 - 我想不出如何搜索這個(我爲此責怪週一,但明天可能會是相同的)。
如果你分拆新主題只有有父線程等待子線程完成,究竟是你獲得? – Powerlord
你是對的 - 我的意思是要覆蓋,並完全跳過它。我會更新。 – MCory
如果您希望事情運行得更快,請將同步而不是順序任務分解爲單獨的線程。 –