💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
排除用户体验的因素,我们从资源分配的层面来分析一下异步I/O的必要性。我们直到计算机在发展过程中将组件进行了抽象,分为I/O设备和计算设备。 假设业务场景中有一组互不相关的任务需要完成,现在的主流方法有以下两种: * 单线程串行依次执行 * 多线程并行完成 如果创建多线程的开销小于并行执行,那么多线程的方式是首选的。多线程的代价在于创建线程和执行期线程上下文切换的开销较大。另外,在复杂的业务中,多线程编程经常面临锁、状态同步等问题,这是多线程被诟病的主要原因。但是多线程在多核CPU上能够有效提升CPU的利用率,这个优势是毋庸置疑的。 单线程顺序执行任务的方式比较符合编程人员按顺序思考的思维方式。它依然是主流的编程方式,因为它易于表达。但是串行执行的缺点在于性能,任意一个略慢的任务都会导致后续执行代码被阻塞。在计算机资源中,通常I/O和CPU计算之间是可以并行进行的。但是同步的编程模型导致的问题是,I/O的进行会让后续任务等待,这造成资源不能被更好利用。 操作系统会将CPU的时间片分配给其余进程,以公平而有效的利用资源,基于这一点,有的服务器为了提升响应能力,会通过启动多个工作进程来为更多的用户服务。但是对于这一组任务而言,它无法分发任务到多个进程上,所以依然无法高效利用资源,结束所有任务所需的时间将会较长。这种模式类似于加三倍服务器,达到占用更多资源来提升服务速度,它并没有真正改善问题。 添加硬件资源是一种提升服务质量的方式,但它不是唯一方式。 单线程同步编程模型会阻塞I/O导致硬件资源得不到更优的使用。多线程编程模型也因为编程中的死锁、状态同步等问题让开发人员头疼。 Node在两者之间给出了它的方案:利用单线程,远离多线程死锁、状态同步等问题;利用异步I/O,让单线程远离阻塞,以更好的利用CPU。 异步I/O可以算作Node的特色,因为它是首个大规模将异步I/O应用在应用层上的平台,它力求在单线程上将资源分配的更高效。 为了弥补单线程无法利用多核CPU的缺点,Node提供了类似前端浏览器中Web worker的子进程,该子进程可以通过工作进程高效的利用CPU和I/O。这部分内容将在第9章中详述。 异步I/O的提出是期望I/O调用不再阻塞后续运算,将原有等待I/O完成的这段时间分配给其它需要的业务去执行。 下图为异步调用I/O示意图: ![](https://box.kancloud.cn/2016-08-28_57c1cec1b7a6e.png)