同步和异步,阻塞和非阻塞

老张爱喝茶,废话不说,煮开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。

1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻

2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。

3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大

4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得自己聪明了。

所谓消息通信机制 (synchronous communication/ asynchronous communication)同步异步,只是与水壶(被调用方的反馈机制)有关与老张(调用者)期间状态没有任何关系。
普通水壶,同步;响水壶,异步。虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。

所谓阻塞非阻塞,仅仅对于老张(调用者)期间状态而言。
立等的老张,阻塞;
看电视的老张,非阻塞。
情况1和情况3中老张就是阻塞

虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用

### 同步异步 同步异步的核心区别在于任务的执行方式以及程序控制流的设计。 - **同步**是指调用方发出求后,必须等待该求的结果返回才能继续执行后续逻辑[^1]。这意味着如果某个操作耗时较长(如网络求或磁盘I/O),整个线程会被挂起直至操作完成。 - **异步**则是指调用方无需等待当前操作结束即可立即处理其他事务[^2]。当目标操作完成后,系统会通知调用方或者回调指定的方法来获取结果。 ### 阻塞非阻塞 阻塞非阻塞的关键点在于进程在进行输入输出(I/O)操作期间所处的状态变化情况: - 如果采用的是**阻塞模式**, 当前线程将在遇到某些特定条件(比如数据未准备好)下进入停滞状态, 只有满足相应需求之后才会恢复运行[^3]; 这种情况下资源利用率可能较低. - 对于**非阻塞形式**, 即使所需的数据暂时不可得, 程序也不会因此停止工作而是持续尝试查询直到成功为止或者是采取另外一种策略去应对这种情况. ### 应用场景分析 #### 同步阻塞 适用于简单短时间内的交互过程,例如本地文件的小规模读写活动。由于其易于理解实现的特点,在许多基础应用场合仍然广泛存在. ```python with open('example.txt', 'r') as file: content = file.read() # 此行为典型的同步阻塞操作 print(content) ``` #### 同步非阻塞 常见于游戏开发等领域中的轮询机制里。尽管它避免了长时间占用CPU的情况发生,但由于频繁检测状态改变可能会带来额外开销. ```c++ while (!dataReady()) { usleep(100); // 微秒级休眠减少CPU消耗 } processData(getData()); ``` #### 异步阻塞 虽然理论上听起来矛盾,但实际上可以通过诸如`await`关键字配合协程结构达成效果——允许单一线程环境下模拟多任务并行的能力的同时保持一定的简洁度. ```javascript async function fetchData() { const response = await fetch('https://api.example.com/data'); console.log(await response.json()); } fetchData(); console.log("This will be printed before the data is fetched."); ``` #### 异步非阻塞 这是现代高性能服务器架构中最推崇的一种设计思路之一,特别是在面对大量并发连接求的时候表现尤为突出。Node.js就是一个典型代表平台. ```nodejs fs.readFile('/etc/passwd', (err, data) => { if (err) throw err; console.log(data); }); // 上述代码片段展示了如何利用回调函数来进行异步非阻塞式的文件读取操作 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值