node.js是单线程。
好处就是
1)简单
2)高性能,避免了频繁的线程切换开销
3)占用资源小,因为是单线程,在大负荷情况下,对内存占用仍然很低
3)线程安全,没有加锁、解锁、死锁这些问题
Node.js是单线程的,它通过事件轮询(event loop)来实现并行操作。可以在不新增额外线程的情况下,依然可以对任务进行并行处理。
Node.js 借助事件驱动, 非阻塞I/O 模型变得轻量和高效, 非常适合 运行在分布式设备 的 数据密集型 的实时应用。V8引擎执行Javascript的速度非常快,性能非常好。
非阻塞I/O和阻塞I/O分析:
我们可以将同步I/O称为阻塞I/O,非阻塞I/O称为异步I/O。同步I/O当请求发出之后,应用程序就会阻塞,直到请求满足为止;非阻塞I/O允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。
在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。
非阻塞I/O的程序一般是单线程的,因此,服务端接收的客户端请求数并不随着工作线程数的增加而增加。所以使用非阻塞I/O模式就不会受到操作系统对线程总数的限制,也不会 占用大量的服务器资源。
非阻塞I/O和同步I/O最明显的不同就是同步I/O所有可能被阻塞的地址在非阻塞I/O中都不会被阻塞。如在读取数据时,如果数据暂时无法被读取。那么 在非阻塞I/O中会立刻返回,以便程序可以执行其他的代码,然后系统会不断侦测这个未完成的读取操作,直到可以继续读数据时再来完成这个操作。
如:file.txt的内容是:hello world
非阻塞:
其输出的结果是
end,
hello world
程序不会等待文件读取,而是继续执行输出end,等到文件读取完成后就会回调响应函数,输出hello world
阻塞
其结果是:
hello world
end.
程序会等待文本读取完毕输出读取结果后再往下面执行,输出end。
结果分析:
非阻塞I/O发送请求后立即返回执行后面的语句,执行完以后进入时间循环监听,当fs接受到I/O请求完成事件时,事件循环会主动调用 回调函数执行后续工作,同步则是阻塞等待完成后,再继续执行。
自定义事件:
例一:
例二:
运行结果:
依次执行了。