-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
node 适合 IO 密集型场景,不适合做复杂计算。
这两天研究了 node 为什么在处理 IO 任务时比较快,在这个 issue 记录下。
多线程服务器
传统的多线程服务器如 Java 服务器,会为每个接收到的请求单独创建一个线程。一个 Java 进程中的线程共享所有内存,这意味着不同线程可以共享其他线程创建的变量。这种多线程的方式会带来以下问题:
- 多线程上下文切换时会带来额外的开销,并且在高并发场景下,这种切换成本比较昂贵,因此多线程服务器支持的并发数量上限不高,一旦请求数量超过了该上限,就会出现阻塞的现象。
- 当两个线程所需的资源被对方锁定后,会出现死锁现象。
- 由于多线程共享内存,可以同时对某一个变量进行读写,因此需要协调好线程读写顺序,保证数据一致性。
node 服务器
不同于多线程服务器,node 服务器采取了一种新的解决高并发的方式,一个 node 服务进程只包含一个主线程和许多在后台运行的子线程。主线程与子线程的通信方式采用事件消息机制,当子线程完成任务后,会把任务回调放入任务队列中并通知主线程中有队列中有任务待处理,当主线程中所有任务执行完毕后,会转而执行任务队列中的队首任务。
在 node 服务器这种机制下,所有任务和代码都是非阻塞的,后台子线程的并发数量要比多线程服务器的线程数量高很多,并且不需要考虑死锁和数据一致性,开发流程更为简单。

