无阻塞 编程模型
Posted ksongking
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无阻塞 编程模型相关的知识,希望对你有一定的参考价值。
无阻塞 编程模型 涉及到 异步回调流, Task, async await, 线程池, 并发编程, 并行编程, 大并发架构, 操作系统 之上 编程模型 的 发展 等等 。
我这段时间对 这个领域 的 现状 进行了一些 收集整理 和 批判 , 请看 :
《后线程时代 的 应用程序 架构》 https://www.cnblogs.com/KSongKing/p/10228842.html
《我 反对 使用 async await》 https://www.cnblogs.com/KSongKing/p/10216913.html
单纯 从 执行效率 看, 也许 同步方法 最直接, 效率也最高 。 只要 配合 线程池 合理使用 线程 就可以 。
异步方法 的 意义 在于 实现 无阻塞 模式,
而 无阻塞 模式 的 意义 要在 大并发 且 IO 等待时间显著 、IO 可能长时间等待 、 IO 等待时间不确定(可能有意外) 的时候 才会 体现出来 。
什么是 IO 等待 ? IO 等待 本质上是 CPU 对 外部设备 的 等待 。
从 应用 上说, IO 等待 就是 访问数据库, 调用 WebApi, 读写文件, RPC 等 。
假设 线程池 有 1000 个 线程, 可以同时处理 1000 个 用户 的 请求, 每个请求 都 需要 访问数据库,
如果 数据库 的 查询缓慢, 则 这 1000 个 线程 可能 都会 去等待 数据库, 当有 第 1001 个 以上的 用户 访问 网站 时, 线程池 将 没有 多余 的 线程 去 处理 第 1001 个 以上的 用户 的 请求, 这种情况 如果 持续一段时间, 就会变成 服务器 不能提供 服务, 如果 数据库 处于 “挂掉” 的 异常状态, 则 Web 服务器 线程池 里 的 1000 个 线程 都将 长期 等待数据库 而 挂起, 这样 服务器 就 不能提供 服务, 或者 变得 异常缓慢 (对 用户而言) 。
微服务 的 “雪崩‘, 大概 也是 从这里来的 。
且 从 广义 的 角度 来讲, 线程池 的 1000 个 线程 本来 还可以有一部分 去做 其它 工作(不需要 访问数据库 的 工作,或是 访问 其它数据库 的 工作), 但 都卡在 访问 A 数据库 这里了 。
但是, 我们 又不能 采用 无限制 的 创建线程(New Thread)的 方式,
以上是关于无阻塞 编程模型的主要内容,如果未能解决你的问题,请参考以下文章
并发编程 - IO模型 - 1.io模型/2.阻塞io/3.非阻塞io/4.多路复用io