2016-02-05 76 views

回答

1

這是一個相當複雜的問題。

吞吐量而言,兩種方法在系統負載下通常執行大致相同。如果你想最大限度地提高吞吐量,你只需要確保你所有的核心都在忙着做需要做的工作,而且這對任何一種設計都是一樣的。

根據延遲 - 每個ABC序列所需的掛鐘時間 - 對於整個序列使用1個線程有時可能表現更好。當1線程完成它的A時,它幾乎總是會立刻開始做B。如果它將B關閉到另一個線程池,那麼通常會有一些不確定的延遲,然後B池中的某個線程將其啓動並開始工作。當這個系統處於壓力下時,這只是一個問題......但如果它沒有受到壓力,那麼這並不重要。

根據設計,有折衷。選項1很容易得到正確的。如果您花費相同的資源(相同的線程總數),那麼以簡單的方式進行操作對於多種作業都會表現出色。

選項2(多個池)是更多的工作來獲得正確的,因爲你必須控制每個隊列得到多長時間。如果已經有很多東西在等待B,那麼您不想再繼續使用,因爲您應該使用這些內核來保持延遲,等等。對於某些類型的作業,雖然這種控制是有用的。例如,如果所有的Bs都爭用一個通用的I/O資源,那麼無論如何都有一大堆線程在執行B,因爲除了一個或兩個以外,其他所有的線程都會被阻塞。在這種情況下,選項2將有更少的線程堆棧掛在內存中無所事事,爭用稀少資源的較少線程(爭用成本週期)等。

作爲一般規則,我會使用選項1目的。當您想要對調度進行復雜的控制時,選項2真的非常有用。

但注意:這些選項並不相互排斥。即使在選項2中,每個「任務」都會分解爲更小的任務,所以我們真正在談論的是何時將某些事情交給另一個線程池。當你需要執行每個任務的不同數量的線程時,你會這樣做,這通常發生在某些任務會導致太多線程與資源相互爭奪或阻止阻塞時發生。

+0

哇謝謝你的答案! – aaronv