事件驱动和异步IO通常,当服务器编写处理模型的程序时,会出现以下模型:
)1)每次收到请求时,都会创建新的进程来处理该请求;
)2)每次收到请求时,都会创建一个新线程来处理该请求;
)3)每次收到请求时,都会加入事件列表,使主进程可以通过无阻断I/O方式处理请求
上面的几种方式,各有千秋,
在(1)的方法中,由于制作新工艺的开销大,所以服务器的性能会恶化,但实现比较简单。
)第二种方式,因为涉及线程的同步,所以有可能面临死锁等问题。
)第三种方式是,撰写APP二维码时,逻辑比前面两个复杂。
综合考虑各方面的因素,一般来说,第(3)方式被认为是很多网络服务器采用的方式
看图说话事件驱动模型
在UI编程中,经常与鼠标点击相对应,那么首先如何获得鼠标点击呢?
方式一:创建一个线程,该线程一直循环检测是否有鼠标点击,那么这个方式有以下几个缺点:
1. CPU资源的浪费,鼠标点击的频率可能非常低,但扫描线程一直在循环中被检测到,这会导致很多CPU资源的浪费; 如果扫描和单击鼠标的界面被阻止了呢?
2 .如果堵塞,则会出现以下问题。 除了扫描并单击鼠标外,还会扫描键盘是否被按下。 扫描鼠标时被卡住了,所以可能不会扫描键盘。
3 .如果一个周期扫描的设备非常多,这又会导致响应时间问题;
所以,这种方式非常不好。
方式二:就是事件驱动模型
目前,大多数UI编程都是事件驱动模型,许多UI平台都提供onClick )事件。 此事件表示鼠标按下事件。 事件驱动模型的大致思路如下。
1 .有事件(消息)队列
2 .按下鼠标时,将单击事件(消息)添加到此队列
3 .存在一个循环,用于继续从队列中取出事件,并为每个事件调用不同的函数,如onClick ()、onKeyDown ()
4 .一般情况下,每个事件(消息)都有自己的处理函数指针。 这样,每个消息都有独立的处理函数。
事件驱动编程是编程的一种范式,在其中程序的执行流由外部事件确定。 其特征在于,它包含一个事件循环,在发生外部事件时使用回调机制触发相应的处理。 另外两种常见的编程范式是“单线程”同步和多线程编程。
通过示例比较和比较单线程、多线程和事件驱动的编程模型。 下图显示了随着时间的推移,程序将在这三种模式下执行的任务。 此程序需要完成三项任务,每个任务在等待I/O操作时都会阻止自身。 I/O操作所需的时间用灰色框表示。
在单线程同步模型中,任务按顺序执行。 如果任务因I/O而被阻止,则所有其他任务必须等待,直到完成。 这种明确的执行顺序和序列化处理的行为很容易推断出来。 任务之间没有依存关系,但需要相互等待时,这会不必要地降低程序的执行速度。
在多线程版本中,这三个任务中的每一个都在独立的线程上执行。 这些线程由操作系统管理,可以在多处理器系统上并行处理,也可以在单处理器系统上交错执行。 这样,在一个线程被资源阻止的同时,其他线程可以继续运行。 此方法比完成具有类似功能的同步程序更有效,但程序员必须编写代码以保护共享资源,避免被多个线程同时访问。 多线程程序必须使用锁定、可重入函数、线程本地存储或其他机制来解决线程安全问题,如果安装不当,会出现微妙而痛苦的bug,因此更难推测
事件驱动程序交替执行三个任务,但仍在控制一个独立的线程。 如果要处理I/O等昂贵操作,请在事件循环中注册回调,并在I/O操作完成后继续。 回调描述如何处理事件。 事件循环轮询所有事件,并将其指派给回调函数以在事件到达时等待处理事件。 这样就可以尽可能地运行程序,而不需要额外的线程。 事件驱动程序比多线程程序更容易估计行为。 因为程序员不需要在意线程安全问题。
事件驱动模型适用于面临以下环境:
程序有很多任务,…
任务之间是高度独立的,不需要相互通信,也不需要相互等待。 然后…
等待事件到来时,某些任务将被阻止。
这也适用于APP应用程序需要在任务之间共享可变数据的情况。 因为不需要采用同步处理。
通常,网络APP应用程序具有这些特征,可以很好地匹配事件驱动的编程模型。
----------------
作者: rainyday66
来源: CSDN
原文: 3359 blog.csdn.net/QQ _ 34173549/article/details/80212101
声明:本文为博主原创文章。 转载请附上博文链接!