【分布式理论8】分布式调用之:四种IO模型
文章目录
- 一. 四种IO模型
- 1. 同步阻塞 IO(Blocking IO)
- 2. 同步非阻塞 IO(Non-blocking IO)
- 3. IO 多路复用(IO Multiplexing)
- 4. 异步 IO(Asynchronous IO)在 RPC 中的作用
- 5. 总结
- 选择多路复用或异步IO
在【分布式理论7】分布式调用之:服务间的(RPC)远程调用 我们知道了RPC(Remote Procedure Call,远程过程调用)过程中数据会进行多次的复制和传递,所以IO 模型的选择对系统的性能、吞吐量和响应时间有重要影响。不同的 IO 模型适用于不同的 RPC 场景,接下来我们具体分析下这四种IO模型。
一. 四种IO模型
1. 同步阻塞 IO(Blocking IO)
在同步阻塞 IO 模型下,RPC 客户端或服务器在进行网络通信时,会一直阻塞等待数据返回,这种方式的优点是实现简单,代码逻辑清晰,但缺点是效率较低,特别是在高并发情况下,阻塞会导致线程资源浪费,影响吞吐量。
工作原理
- 应用程序在用户空间向服务器发送请求。
- 内核接收请求,并等待数据从网络到达。
- 数据到达后,先存入内核缓冲区。
- 内核将数据复制到应用缓冲区。
- 复制完成后,应用程序才能继续执行数据处理。
在整个过程中,应用程序在数据未到达前一直处于等待状态,无法执行其他任务。
比喻:饭店点餐
同步阻塞 IO 就像在饭店点餐后,客人一直坐在座位上等菜上桌,期间什么也不做,直到菜全部端上来后才开始吃饭。
2. 同步非阻塞 IO(Non-blocking IO)
在同步非阻塞 IO 模型下,RPC 服务器在处理请求时,不会一直等待数据返回,而是会定期轮询内核数据是否可用,这种方式可以让在同步非阻塞 IO 模型下,RPC 服务器在处理请求时,不会一直等待数据返回,而是会定期轮询内核数据是否可用,这种方式可以让 RPC 服务器在等待数据的同时,执行其他任务,提高资源利用率。在等待数据的同时,执行其他任务,提高资源利用率。
工作原理
- 应用程序向服务器发起请求。
- 内核检查数据是否准备好。
- 如果数据还未准备好,内核立刻返回一个错误信息。
- 如果数据准备好,数据存入内核缓冲区。
- 应用程序周期性地轮询内核,检查数据是否可用。
- 数据准备好后,应用程序读取数据,并将其从内核缓冲区复制到应用缓冲区。
- 复制完成后,应用程序执行数据处理。
在数据未准备好时,应用程序不会阻塞,而是可以执行其他任务。
比喻:饭店点餐
同步非阻塞 IO 就像客人点餐后,可以玩手机、聊天,每隔一段时间问服务员“菜好了没有?”,如果还没好就继续做自己的事,直到菜准备好再吃饭。
缺点: 1. 轮询会造成 CPU 资源浪费,影响系统整体性能、2. 如果轮询间隔设置不合理,可能会导致 RPC 响应延迟。
3. IO 多路复用(IO Multiplexing)
IO 多路复用(如 select
、poll
、epoll
)是 RPC 服务器常用的 IO 处理方式。通过一个复用器(如 epoll
),服务器可以管理多个 RPC 连接(即监听多个IO请求),并且只在数据到达时才进行读取和处理(how),而不需要不断轮询,提高了系统吞吐量。
工作原理
- 复用器(Selector) 进程负责监听多个网络请求的 IO 状态。
- 用户进程调用复用器,并进入阻塞状态。
- 复用器监听多个 IO 连接,一旦有某个连接的数据准备好,它就会通知对应的用户进程。
- 用户进程读取数据,并将其从内核缓冲区复制到应用缓冲区。
- 复制完成后,应用程序执行数据处理。
比喻:饭店点餐
IO 多路复用就像一群人一起吃饭,他们的订单由同一个传菜员负责。传菜员会统一管理所有人的订单,一旦某道菜做好,就立刻送给对应的客人,而不是每个客人自己反复去问“我的菜好了没?”
优缺点:
类别 | 描述 |
---|---|
优点 | 高并发适用:适合同时处理大量连接,如 RPC 服务器、微服务网关等。 |
线程数减少:可以使用少量线程管理大量连接,降低 CPU 和内存消耗。 | |
成熟稳定:epoll 在 Linux 下表现优秀,广泛应用于 Netty、Nginx、Redis 等高性能网络程序。 | |
缺点 | 仍然需要数据拷贝:数据到达内核缓冲区后,需要用户态进程主动读取,仍有一定的 CPU 消耗。 |
适用于 I/O 密集型:当业务计算量较大时,可能会成为瓶颈。 |
适用场景
- 高并发 RPC 服务器(如 Netty + gRPC)。
- HTTP 服务器(如 Nginx、Tomcat)。
- 数据库代理(如 MySQL Proxy)。
- 消息队列(如 Kafka、RabbitMQ)。
4. 异步 IO(Asynchronous IO)在 RPC 中的作用
异步 IO(AIO)模式下,RPC 调用不会阻塞或轮询,而是直接注册回调函数,当数据准备好时,由内核通知应用程序进行处理。这种模式能最大化提高 IO 效率,但实现较复杂,需要支持异步编程模型(如 Java 的 NIO
和 CompletableFuture
)。
适用场景
- 高吞吐 RPC 框架(如 Dubbo、gRPC 的异步模式)。
- 高并发流式数据处理(如 Kafka、Flink)。
- 事件驱动架构(EDA)(如 Node.js)。
- 微服务异步通信(如 Kafka + Spring WebFlux)。
异步 IO(Asynchronous IO)的优缺点
类别 | 描述 |
---|---|
优点 | 真正的异步处理:不需要应用进程主动轮询或读取数据,由内核完成数据拷贝后直接通知用户态,减少 CPU 开销。 |
适用于 CPU 密集型:在计算任务较多的场景下,异步 IO 可让计算与 IO 并行,提高系统吞吐量。 | |
缺点 | 实现复杂度高:需要采用异步编程模型,如 Future 、Promise 、Callback ,可能导致代码可读性变差(如回调地狱)。 |
操作系统支持有限:虽然 Linux 提供了 io_uring ,但异步 IO 生态尚未完全成熟,部分应用仍倾向使用 IO 多路复用。 |
5. 总结
IO 模型 | 是否阻塞 | 是否轮询 | 适用场景 |
---|---|---|---|
同步阻塞 IO | 阻塞 | 无 | 简单的单线程应用 |
同步非阻塞 IO | 非阻塞 | 需要轮询 | 资源利用率较高,但增加 CPU 开销 |
IO 多路复用 | 阻塞(等待事件) | 复用器代替轮询 | 适用于高并发场景,如 RPC、服务器编程 |
异步 IO | 非阻塞 | 否(注册回调函数) | 适合超高并发、低延迟 RPC 需求,实现复杂,但性能最佳。 |
选择多路复用或异步IO
对比项 | IO 多路复用 | 异步 IO(AIO) |
---|---|---|
并发能力 | 高(支持大量连接) | 更高(IO 与计算可并行) |
CPU 开销 | 适中(事件驱动但仍需读取数据) | 低(数据直接拷贝到用户缓冲区) |
代码复杂度 | 低(事件模型较成熟) | 高(回调、异步编程) |
适用场景 | 高并发网络服务器、RPC、数据库代理 | 高吞吐 RPC、流式处理、大量 I/O 任务 |
操作系统支持 | epoll (Linux)、kqueue (BSD) | io_uring (Linux),支持度较低 |
- 高并发场景:优先 IO 多路复用(
epoll
),如 gRPC、Netty。 - 低延迟、极高吞吐:优先 异步 IO,如 Dubbo 异步 RPC。
- 复杂业务逻辑:建议 IO 多路复用,避免回调地狱。
- 计算与 IO 并行:异步 IO 更优,如 AI 推理、流式计算任务。
相关文章:
【分布式理论8】分布式调用之:四种IO模型
文章目录 一. 四种IO模型1. 同步阻塞 IO(Blocking IO)2. 同步非阻塞 IO(Non-blocking IO)3. IO 多路复用(IO Multiplexing)4. 异步 IO(Asynchronous IO)在 RPC 中的作用5. 总结 选择…...
MySQL 库建表数量有限制吗?
问:MySQL 库建表数量有限制吗? 答:无限制 官方文档: MySQL has no limit on the number of databases. The underlying file system may have a limit on the number of directories. MySQL has no limit on the number of tabl…...
使用OpenGL自己定义一个button,响应鼠标消息:掠过、点击、拖动
button需要有一个外观 外观 大小跟随窗口改变,采用纯色背景、纯色文字 文字 大小跟随窗口改变 button需要获得鼠标消息 掠过 鼠标掠过时 button 出现阴影,鼠标掠过后 button 阴影消失 点击 点击后进入相应事件 拖动 改变图标所在位置 需要在g…...
基础入门-网站协议身份鉴权OAuth2安全Token令牌JWT值Authirization标头
知识点: 1、网站协议-http/https安全差异(抓包) 2、身份鉴权-HTTP头&OAuth2&JWT&Token 一、演示案例-网站协议-http&https-安全测试差异性 1、加密方式 HTTP:使用明文传输,数据在传输过程中可以被…...
【Python】元组
个人主页:GUIQU. 归属专栏:Python 文章目录 1. 元组的本质与基础概念1.1 不可变序列的意义1.2 元组与数学概念的联系 2. 元组的创建方式详解2.1 标准创建形式2.2 单元素元组的特殊处理2.3 使用 tuple() 函数进行转换 3. 元组的基本操作深入剖析3.1 索引操…...
深度求索与DeepSeek-R1:探索人工智能的新纪元
深度求索与DeepSeek-R1:探索人工智能的新纪元 引言 在当今快速发展的科技领域,尤其是人工智能(AI)方面,每隔一段时间就会出现一款革命性的产品或技术,彻底改变我们对这一领域的认知。2025年初,…...
java: framework from BLL、DAL、IDAL、MODEL、Factory using oracle
oracel 21c sql: -- 创建 School 表 CREATE TABLE School (SchoolId CHAR(5) NOT NULL,SchoolName NVARCHAR2(500) NOT NULL,SchoolTelNo VARCHAR2(8) NULL,PRIMARY KEY (SchoolId) );CREATE OR REPLACE PROCEDURE addschool(p_school_id IN CHAR,p_school_name IN NVARCHAR2,p…...
kafka生产端之架构及工作原理
文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前,有可能需要经历拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)等一系列的作用,那么在此之后又会…...
DeepSeek结合Langchain的基本用法
DeepSeek结合Langchain的基本用法 DeepSeek 基于Openai接口规范的Prompt应答Deepseek结合LangchainDeepSeek 基于langchain的结构化返回 DeepSeek 基于Openai接口规范的Prompt应答 首先我们需要先基于pip 安装 pip install openai最开始我们先熟悉如何使用openai的接口规范&a…...
Python与java的区别
一开始接触Python的时候,哔哩视频铺天盖地,看了很多人主讲的,要找适合自己口味的,各种培训机构喜欢在各种平台引流打广告,看了很多家,要么就是一个视频几个小时,长篇大论不讲原理只讲应用&#…...
win10 llamafactory模型微调相关① || Ollama运行微调模型
目录 微调相关 1.微调结果评估 2.模型下载到本地 导出转换,Ollama运行 1.模型转换(非常好的教程!) 2.Ollama 加载GGUF模型文件 微调相关 1.微调结果评估 【06】LLaMA-Factory微调大模型——微调模型评估_llamafactory评估-C…...
全国路网矢量shp数据(分不同类型分省份)
科研练习数据 全国路网矢量shp数据(分不同类型分省份) 有需要的自取 数据格式:shp(线) 数据包含类型:城市主干道、城市次干道、城市快速路、城市支路、高速公路、内部道路、人行道、乡村道路、自行车道路…...
RocketMq之Broker注册流程详解
1.前言 前面我也是写过一些关于broker注册到NameServer里的代码分析,但是总感觉写的比较简单,今天这篇的话,算是重新梳理一篇broker注册到NameServer中的代码,感兴趣的可以看下我前面写的几篇博客: 1.NameServer的主…...
关于精度话题的杂谈
“ 浮点值的存储、运算都可能会带来精度损失,了解精度损失背后的机制原因方便我们更好的了解什么情况下会发生精度损失、什么情况下精度损失较大,以及思考怎么避免或减少精度损失。” 01 杂谈 之前在CSDN上写过《关于float浮点值二进制存储和运算精度损失…...
AD域控粗略了解
一、前提 转眼大四,目前已入职上饶一公司从事运维工程师,这与我之前干的开发有着很大的差异,也学习到了许多新的知识。今天就写下我对于运维工作中常用的功能——域控的理解。 二、为什么要有域控,即域控的作用 首先我们必须要…...
emlog最新跨站脚本漏洞(CNVD-2025-01607、CVE-2024-13140)
EMLOG是一款轻量级开源博客和CMS建站系统,速度快、省资源、易上手,适合各种规模的站点搭建,基于PHPMySQL开发。 国家信息安全漏洞共享平台于2025-01-16公布该程序存在跨站脚本漏洞。 漏洞编号:CNVD-2025-01607、CVE-2024-13140 …...
DeepSeek-r1和O1、O3mini谁更强?
DeepSeek-r1和O1、O3mini谁更强? 题目:编写一个 js 程序,显示一个球在旋转的六边形内弹跳。球应该受到重力和摩擦力的影响,并且必须逼真地从旋转的墙壁上弹起 DeepSeek-r1 <!DOCTYPE html> <html> <body> &l…...
代码随想录_二叉树
二叉树 二叉树的递归遍历 144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历 // 前序遍历递归LC144_二叉树的前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result new ArrayList<Integer&g…...
时序数据库:Influxdb详解
文章目录 一、简介1、简介2、官网 二、部署1、安装2、配置(1)用户初始化 三、入门(Web UI)1、加载数据(1)上传数据文件(2)代码接入模板 2、管理存储桶(1)创建…...
内存泄漏及检测办法
什么情况下会产生内存泄漏? 内存泄漏如何检测? 使用 valgrind 对象计数 基本思路: 在对象的构造函数中增加计数:每次创建一个对象时,增加一个计数。在对象的析构函数中减少计数:每次销毁一个对象时&…...
BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)
代码地址:BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据) BiGRU双向门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景和意义 随着全球对可再生能源需求的不断增长,光伏…...
Leetcode 3448. Count Substrings Divisible By Last Digit
Leetcode 3448. Count Substrings Divisible By Last Digit 1. 解题思路2. 代码实现 题目链接:3448. Count Substrings Divisible By Last Digit 1. 解题思路 这一题的话我们走的是一个累积数组的思路。 首先,我们使用一个cache数组记录下任意段数字…...
青少年编程与数学 02-009 Django 5 Web 编程 03课题、项目结构
青少年编程与数学 02-009 Django 5 Web 编程 03课题、项目结构 一、项目结构项目根目录应用目录其他目录 二、项目设置Django 插件设置项目配置环境变量设置项目目录标记版本控制 三、Django 插件安装 Django 插件配置 Django 插件使用 Django 插件功能 四、扩展插件开发效率插…...
【玩转 Postman 接口测试与开发2_018】第14章:利用 Postman 初探 API 安全测试
《API Testing and Development with Postman》最新第二版封面 文章目录 第十四章 API 安全测试1 OWASP API 安全清单1.1 相关背景1.2 OWASP API 安全清单1.3 认证与授权1.4 破防的对象级授权(Broken object-level authorization)1.5 破防的属性级授权&a…...
UA-Track:不确定性感知端到端3D多目标跟踪
论文地址:https://arxiv.org/pdf/2406.02147 主页:https://liautoad.github.io/ua-track-website/ 3D多目标跟踪(MOT)在自动驾驶感知中起着至关重要的作用。最近基于端到端查询的跟踪器可以同时检测和跟踪对象,这在3D …...
Windows下AMD显卡在本地运行大语言模型(deepseek-r1)
Windows下AMD显卡在本地运行大语言模型 本人电脑配置第一步先在官网确认自己的 AMD 显卡是否支持 ROCm下载Ollama安装程序模型下载位置更改下载 ROCmLibs先确认自己显卡的gfx型号下载解压 替换替换rocblas.dll替换library文件夹下的所有 重启Ollama下载模型运行效果 本人电脑配…...
萌新学 Python 之字符串及字符串相关函数
字符串:单引号、双引号、三个单引号、三个双引号 字符串属于不可变的数据类型,一旦被定义,内存地址不变 name 张三 # 字符串赋值给name后,内存地址存储张三,地址不变 username 张三 # 张三去内存中找…...
【鸿蒙开发】第二十四章 AI - Core Speech Kit(基础语音服务)
目录 1 简介 1.1 场景介绍 1.2 约束与限制 2 文本转语音 2.1 场景介绍 2.2 约束与限制 2.3 开发步骤 2.4 设置播报策略 2.4.1 设置单词播报方式 2.4.2 设置数字播报策略 2.4.3 插入静音停顿 2.4.4 指定汉字发音 2.5 开发实例 3 语音识别 3.1 场景介绍 3.2 约束…...
Java | RESTful 接口规范
关注:CodingTechWork 引言 作为一名程序员,制定清晰、一致且高效的 RESTful 接口规范对于团队的开发效率和项目的长期维护至关重要。本文将详细介绍 RESTful 接口的设计理念、请求方法分类、核心规范,以及正确和错误的示例,帮助团…...
shell脚本控制——处理信号
Linux利用信号与系统中的进程进行通信。你可以通过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本的操作。 1.重温Linux信号 Linux系统和应用程序可以产生超过30个信号。下表列出了在shell脚本编程时会遇到的最常见的Linux系统信…...
OpenGL学习笔记(十二):初级光照:投光物/多光源(平行光、点光源、聚光)
文章目录 平行光点光源聚光多光源 现实世界中,我们有很多种类的光照,每种的表现都不同。将光投射(Cast)到物体的光源叫做投光物(Light Caster)。 平行光/定向光(Directional Light)点光源(Point Light)聚光(Spotlight) 平行光 当一个光源处于很远的地…...
redis底层数据结构——整数集合
文章目录 定义内部实现升级升级的好处提升灵活性节约内存 降级总结 定义 整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层…...
w198基于Springboot的智能家居系统
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter2-HTML 中的 JavaScript
二、HTML 中的 JavaScript 将 JavaScript 插入 HTML 的主要方法是使用<script>元素。 <script>元素有下列 8 个属性。 async:可选。表示应该立即开始下载脚本,但不能阻止其他页面动作,比如下载资源或等待其他脚本加载。只对外部…...
【5】阿里面试题整理
[1]. 介绍一下ZooKeeper ZooKeeper是一个开源的分布式协调服务,核心功能是通过树形数据模型(ZNode)和Watch机制,解决分布式系统的一致性问题。 它使用ZAB协议保障数据一致性,典型场景包括分布式锁、配置管理和服务注…...
系统思考—自我超越
“人们往往认为是个人的能力限制了他们,但事实上,是组织的结构和惯性思维限制了他们的潜力。”—彼得圣吉 最近和一家行业隐形冠军交流,他们已经是领域第一,老板却依然要求:核心团队都要自我超越,攻坚克难…...
大模型-ALIGN 详细介绍
ALIGN模型(A Large-scale ImaGe and Noisy-text embedding)是一种大规模图像和噪声文本嵌入模型,它通过对比学习的方式将图像和文本嵌入到同一个向量空间中,使得匹配的图像-文本对的嵌入向量接近,不匹配的则远离。这种…...
【C++高并发服务器WebServer】-15:poll、epoll详解及实现
本文目录 一、poll二、epoll2.1 相对poll和select的优点2.2 epoll的api2.3 epoll的demo实现2.5 epoll的工作模式 一、poll poll是对select的一个改进,我们先来看看select的缺点。 我们来看看poll的实现。 struct pollfd {int fd; /* 委托内核检测的文件描述符 */s…...
【算法】动态规划专题⑩ —— 混合背包问题 python
目录 前置知识进入正题总结 前置知识 【算法】动态规划专题⑤ —— 0-1背包问题 滚动数组优化 【算法】动态规划专题⑥ —— 完全背包问题 python 【算法】动态规划专题⑦ —— 多重背包问题 二进制分解优化 python 混合背包结合了三种不同类型的背包问题:0/1背包…...
Java高频面试之SE-20
hello啊,各位观众姥爷们!!!本baby今天又来了!哈哈哈哈哈嗝🐶 Java的泛型是什么? Java 泛型(Generics) 是 Java 5 引入的一项重要特性,用于增强代码的类型安…...
springboot 事务管理
在Spring Boot中,事务管理是通过Spring框架的事务管理模块来实现的。Spring提供了声明式事务管理和编程式事务管理两种方式。通常,我们使用声明式事务管理,因为它更简洁且易于维护。 1. 声明式事务管理 声明式事务管理是通过注解来实现的。…...
opentelemetry-collector 配置elasticsearch
一、修改otelcol-config.yaml receivers:otlp:protocols:grpc:endpoint: 0.0.0.0:4317http:endpoint: 0.0.0.0:4318 exporters:debug:verbosity: detailedotlp/jaeger: # Jaeger supports OTLP directlyendpoint: 192.168.31.161:4317tls:insecure: trueotlphttp/prometheus: …...
IDEA关联Tomcat,部署JavaWeb项目
将IDEA与Tomcat关联 创建JavaWeb项目 创建Demo项目 将Tomcat作为依赖引入到Demo中 添加 Web Application 编写前端和后端代码 配置Tomcat server,并运行...
位图与位运算的深度联系:从图像处理到高效数据结构的C++实现与优化
在学习优选算法课程的时候,博主学习位运算了解到位运算的这个概念,之前没有接触过,就查找了相关的资料,丰富一下自身,当作课外知识来了解一下。 位图(Bitmap): 在计算机科学中有两种…...
运维_Mac环境单体服务Docker部署实战手册
Docker部署 本小节,讲解如何将前端 后端项目,使用 Docker 容器,部署到 dev 开发环境下的一台 Mac 电脑上。 1 环境准备 需要安装如下环境: Docker:容器MySQL:数据库Redis:缓存Nginx&#x…...
DeepSeek-V3 论文解读:大语言模型领域的创新先锋与性能强者
论文链接:DeepSeek-V3 Technical Report 目录 一、引言二、模型架构:创新驱动性能提升(一)基本架构(Basic Architecture)(二)多令牌预测(Multi-Token Prediction…...
react使用if判断
1、第一种 function Dade(req:any){console.log(req)if(req.data.id 1){return <span>66666</span>}return <span style{{color:"red"}}>8888</span>}2、使用 {win.map((req,index) > ( <> <Dade data{req}/>{req.id 1 ?…...
opencv:基于暗通道先验(DCP)的内窥镜图像去雾
目录 项目大体情况 暗通道先验(Dark Channel Prior, DCP)原理 项目代码解析 该项目是由我和我导师与舟山某医院合作开发的一个基于暗通道先验(Dark Channel Prior,DCP)的内窥镜图像去雾方法。具体来说,…...
2025年物联网相关专业毕业论文选题参考,文末联系,选题相关资料提供
一、智能穿戴解决方案研究方向 序号解决方案论文选题论文研究方向1智能腰带健康监测基于SpringBoot和Vue的智能腰带健康监测数据可视化平台开发研究如何利用SpringBoot和Vue技术栈开发一个数据可视化平台,用于展示智能腰带健康监测采集的数据,如心率、血…...
npm无法加载文件 因为此系统禁止运行脚本
安装nodejs后遇到问题: 在项目里【node -v】可以打印出来,【npm -v】打印不出来,显示npm无法加载文件 因为此系统禁止运行脚本。 但是在winr,cmd里【node -v】,【npm -v】都也可打印出来。 解决方法: cmd里可以打印出…...