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请求完成事件时,事件循环会主动调用 回调函数执行后续工作,同步则是阻塞等待完成后,再继续执行。
自定义事件:
例一:
例二:
运行结果:
依次执行了。
相关推荐
本篇文章将深入探讨Node.js如何实现异步I/O,以及相关源码和工具的应用。 一、异步I/O基础 异步I/O是一种编程模式,它使得程序在等待I/O操作完成时不会阻塞,可以继续执行其他任务。在Node.js中,这一特性主要通过...
Node.js中异步操作是通过回调函数、Promises和async/await等技术来实现的。以下我们详细讲解如何通过这些方法实现将异步变成同步。 首先,在JavaScript中,尤其是在Node.js这种以事件驱动、非阻塞I/O模型为特点的...
异步编程的主要方法包括回调函数、事件监听、异步库控制以及Promise等。下面将详细介绍这些方法以及它们在实际应用中可能遇到的问题。 回调函数是最基本的异步编程方法之一。它是一个被作为参数传递给另一个函数的...
Node.js是一种构建快速、可扩展网络应用的平台,其核心在于异步I/O...但开发者在使用Node.js进行开发时,需要注意不要让I/O操作成为性能瓶颈,同时合理利用异步操作和事件驱动的特性,才能构建出高性能的Node.js应用。
现在我们来看看nodejs中的事件驱动和异步I/O是如何实现的. nodejs是单线程(single thread)运行的,通过一个事件循环(event-loop)来循环取出消息队列(event-queue)中的消息进行处理,处理过程基本上就是去调用该消息...
结合提供的资源,"nodejs异步IO的实现 - CNode.htm"可能是对异步I/O原理和实践的详细文章,可能包含实际示例和解释。"nodejs异步IO的实现 - CNode_files"可能包含与文章相关的辅助文件,比如代码片段或其他资料。 ...
- **简化编程模型**:开发者只需要关注事件和回调,而不必处理复杂的线程同步问题。 NodeJS的应用场景广泛,包括但不限于: - **前后端同构开发**:JavaScript环境的一致性简化了开发流程。 - **实时应用**:如聊天...
本篇文章将深入探讨如何利用jQuery的FileUpload插件和Node.js的formidable库实现异步文件上传,并展示上传进度。 ### 文件上传的基本概念 文件上传是指用户通过Web表单选择本地文件,然后将其发送到服务器的过程。...
Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具。 本资源代码配合博客使用:https://blog.csdn.net/qq_25479327/article/details/81148772 NodeJs使用mongoose操作mongodb
Node.js中的异步是基于事件循环实现的,这意味着在任何时候都只有一个单一的调用栈在执行,因此不会有线程安全问题。Node.js官方文档说明其设计目标之一是让开发者能够编写能够处理大量并发连接的代码,而不需要关心...
Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用。在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中...
标题中的“Node.js和浏览器的最小事件库”指的是在Node.js环境和Web浏览器中用于处理事件的轻量级库。事件库是编程中一个重要的工具,它允许程序以异步方式处理事件,提高代码的可读性和可维护性。在这种情况下,...
1. **异步编程**:NodeJS的回调函数、Promise和async/await,是处理异步操作的关键工具,避免了回调地狱。 2. **npm**:NodeJS的包管理器,用于安装、管理和分享依赖库,是NodeJS生态的重要组成部分。 3. **流...
这样,异步操作中产生的异常就可以和同步操作中的一样被 try-catch 捕获和处理了。 但是文章也指出,如果在 Promise 的执行函数中直接使用 throw Error() 抛出异常,那么这个异常依旧不能被 .catch() 方法捕获。这...