多线程和单线程的理解
多线程:
优点:
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进行反复进行线程切换。