异步编程模型的思考

编程/开发
287
0
0
2022-07-17

WX20211101-190630@2x.png

概述

随着移动互联网的迅猛发展,我们对于服务的响应和并发要求越来越高。在这样的背景下催生了形形色色的并发问题、例如C10问题就是非常典型的问题。对于这些形形色色的并发问题,人们演化设计出多种异步编程的模型。所谓的并发是指在同一时间段内程序能交替运行。

关于异步编程思考

在开始之前有这么几个问题需要探讨,什么是异步编程模型、异步编程能解决哪些问题、如何设计出一个异步编程模型。

什么是异步编程

同步/异步:是指程序自始至终都在用一个时间线上运行,异步则是我程序是主时间线上出现了别的时间线分支。

异步编程解决了什么问题

异步编程的宗旨:是高效地解决并发问题,获得更高的并发请求

异步编程具体实现方案

  • 事件轮询

将数据交互过程中出现的各种事件注册到一个事件队列中,再由一些其他的线程来异步消费处理

  • 回调

在上述的事件队列中,其实有个问题,往事件队列中注册一个事件之后,等该事件被触发的那刻,谁来处理后续的业务逻辑?对于这个问题的解决方式就是“回调”,现在高级编程语言都支持“回调”功能。有了“回调”,开发者可以在事件触发前将回调函数和事件绑定起来,等事件触发那一刻,查找出注册好的回调函数在去执行回调函数的逻辑。至此通过回调就轻松实现了异步编程模型。

  • 协程

虽说有了回调就就能满足异步编程,但是回调带来的问题也相当多,比如回调中嵌套回调(地狱回调)、代码不符合人类思维、难于开发维护等。其实人类编程思维还是习惯于同步的编程逻辑,在代码按照书写的顺序一行一行去执行,每次执行结束都能有个返款!!!那么说到这里有没有一种可能?就是我既能达到异步的效果还能书写同步的代码,换言之:就是用同步的代码书写异步的情怀!!!答案是肯定的,协程真是这样背景下出现的一个将异步回调的方式转化为同步代码、但是又有异步功能的技术。协程是一种轻量级线程,调度的逻辑完全就交给用户去控制。这样用户就可以在遇到同步IO的时候 ,挂起当前协程转而执行下一个协程,整个代码逻辑都是顺序书写,被挂起的协程,等待下次再次调度执行。

盘点主流语言和服务器软件异步模型

在这边一起梳理一下市面上主流语言和软件的一些异步编程模型

nginx 是多进程+单进程reactor异步模型,网络请求事件都有reactor线程接管注册分发给worker进程去执行

redis 单线程 reactor异步模型 也是事件分发注册异步编程

netty 单线程reactor异步模型

swoole 多线程reactor+多进程worker

nodejs 单线程+eventLoop

Golang 单线程Reactor+多线程协程

总结

任何技术方案都是在历史长河中演化而来,因此了解一门技术或者方案,最好能了解一下他的前世今生!!!