多線程:
優點:
1. 可以充分利用CPU多核優勢。
2. 編程難度低,JAVA為例。可以利用同步阻塞式的IO模型。
缺點:
1. 線程數量過多時,線程間被操作系統調度,切換線程時會存在性能消耗
2. 多線程並發操作操作同一份數據時,需要考慮線程的安全性問題。
技巧:
1. 使用線程池,控制線程數量不要過多。
單線程:
優點:
1. 不存在多線程並發操作同一份內存數據的問題。
2. 單線程模型一般配合異步非阻塞IO模型,比較適合IO密集型業務。
缺點:
1. 無法利用多核CPU的優點。
2. 異步非阻塞的IO編程模型,編程難度比較大。
技巧:
1. 多進程模式配合單線程模型,充分利用多核。
NodeJS / Redis 的實現方案:
目前來看是我認為最好的線程模型,幾乎解決了所有的缺點。充分利用多核,又能充分利用異步IO
一個主線程+多個Workder線程
1. 主線程:異步非阻塞IO,主要負責處理IO請求。適合IO密集型場景。
2. async / await 語法糖,解決了異步編程中的回調問題。讓異步代碼可以使用 同步的編程思維。
3. 對於CPU耗時的任務,分配到Worker線程中進行處理。適合CPU密集型場景。
4. Worker線程與主線程之間使用postMessage的方式進行通信,數據副本。避免了多線程並發安全性問題。
5. 主線程往Workder線程中postMessage大量數據時,可以采用數據控制權轉移的模式。一旦轉移,主線程就無法再使用這些二進制數據了。
技巧:
工作線程數量等於CPU數量。避免CPU進行反復進行線程切換。