Udemy Course Multithreading, Concurrency & Performance 11
以下討論內容為:
- Throughput definition
- 2 approaches to throughput improvement
- Thread Pooling
Throughput definition:
單位時間內完成的tasks數量
同樣系統下能在時間內處理的tasks數量當然越多越好!
2 approaches to throughput improvement:
Approach 1:
假設完成單一個Original task需要花費T時間
那麼Throughput = 1/T
當這個Original task拆分為N個sub-tasks
Latency = T/N
而Throughput = N/T (理論上)
但是在前面我們為了優化Latency(讓T/N變小)通常會造成:
實際的Throughput <N/T (in practice)
這是前面在做Latency Optimizing可觀察到的
但是考量到Task拆分為sub-tasks優化Latency會有以下因素:
- 將Task分解為sub-tasks +
- 建立Threads,將任務丟進Threads +
- thread.start()到thread真的進到排程之間的時間
- 等待最後完成的thread,並且才能開始Aggregate結果所需要的時間 +
- Aggregate各個sub-tasks處理的時間 +
- Aggregate各個sub-result為單一result處理的時間
最終sub-tasks還是會結合結果,所以在此考量Throughput就不是必要的
Approach 2:
考慮數個Threads同時處理N個Tasks情況下(注意,不是拆分的sub-task)
假設是依序執行才可以完成,總時間是T,則此情況考量下
Latency = T
而Throughput = N/T
而後面還有其他更進階的優化方式(例如 Thread Pooling)
Thread Pooling:
概念上就是應用程式啟動時建立固定數量的Threads
並且每個Thread從Queue中拿取Task做處理
所以當每個Thread都忙碌中,多的Task就要等待有空閒的Thread
當所有Threads都持續忙碌(滿載)時
我們就算是炸出滿載的Thoughput及滿載的Utilization(利用率)
implement Thread Pool並不是瑣碎的
在JDK裡面就有基本的Thread Pool工具可以使用
其中我們將用到:Fixed Thread Pool executor
其中這個executor內也會建立queue來佇列task給Thread處理