同步异步事件驱动

Posted wangyunzhong123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同步异步事件驱动相关的知识,希望对你有一定的参考价值。

参考:
非阻塞式I/O模型、异步与事件驱动–关于NodeJs的思考
Apache和Nginx比较
几种 IO编程比较

首先需要区分一下异步、非阻塞式与事件驱动的定义。

异步

从字面上来看即非同步(asynchronous/synchronous),发出请求后是否需要立即得到回复是异步与同步的工作模式的主要区别。在异步模式中,发出某个请求后不需要等待得到回复,直接return以便于继续后续工作,而同步模式则要求在请求后就得到回复,否则持续在函数内等待且不return进入后续操作。发邮件和打电话这两张联系方式很好的体现了异步与同步的区别,通常当我们发出一封邮件时并不需要立即获得对方的回复,而是继续做自己其它的事情,当对方收到邮件并回复之后再返回继续处理该邮件事宜。而打电话则不同于邮件,拨号后人们通常会持续等待对方接通电话,直到拨号超时挂断。本文提到的Node.js即是典型的异步编程,而HTTP请求即是常见的同步通讯,发出请求并立即获得回应。

非阻塞式

非阻塞式通常是对于I/O操作而言的,意思就是当你请求一个系统调用的时候,不管收到什么结果函数都会立即返回,而不让线程进入休眠状态以等待I/O操作的完成。相反阻塞式I/O方式在请求一个磁盘文件时会进入线程休眠状态以等待磁盘I/O完成后再苏醒。

异步/同步与阻塞式/非阻塞式的区别在于前者主要描述消息通信机制,异步时被调用者通过通知、状态或回调来告知调用者。而后者主要描述程序在等待调用结果时的状态,非阻塞式时调用者主动以一定的间隔时间查看调用是否完成。

感觉还没讲清楚,再来一个栗子。小黄饿了,让妈妈做蛋糕给他吃(发起调用)。

同步阻塞:小黄啥也不干,就盯着(阻塞)妈妈做完蛋糕立即(同步)开吃。

异步阻塞:妈妈让小黄先去一边玩并答应蛋糕一做好就叫小黄来吃(异步通知),但小黄还是什么也不做(阻塞),等着妈妈把蛋糕做好。

同步非阻塞:妈妈开始做蛋糕之后小黄就去看电视了(非阻塞),但隔一下就去厨房看(同步)妈妈做好没。

异步非阻塞:妈妈答应蛋糕一做好就叫小黄来吃(异步通知),小黄安心看电视去了(非阻塞)。

从这里面可以看出,异步通常带有通知(或状态、回调),由被调用者通知调用者任务已完成,同步则调用者主动盯着任务是否完成。阻塞与非阻塞即描述被调用者进行任务时,调用者是干等着还是抽空干点别的。

事件驱动

与事件驱动对应的是流程驱动。流程驱动就是。。。好吧,还真不知道如何解释流程驱动,因为这种驱动方式就是最常用的编程方式,即代码按照既有的编写流程顺序执行。而事件驱动则指某段代码只有在当前层次以外(用户层、操作系统层等)的特定事件发生时才会被执行,如在编写带有GUI(图形用户界面)的程序时,通常需要为界面上的每一个按钮添加监听函数,而该函数则只有在相应的按钮被用户点击的事件发生时才会执行,类似的事件还有鼠标移动、按下、松开、双击等等等等。这就叫事件驱动,几乎所有的GUI程序都使用时间驱动模式。而我们今天要讨论的是服务端的事件驱动,这些事件主要由操作系统层触发,比如文件流读取完成/中断等等。

javascript中,事件驱动主要通过callback(回调)来实现。具体的callback实现方式是将函数A像普通属性一样以参数的形式赋给另一个函数B,此时控制权被转交给B函数,A函数也被托付给B函数并由其决定何时执行A函数中的内容。这是事件驱动的一个关键概念——控制反转,即必须将一部分代码的执行主动权交给另一方控制,另一方才能在合适的时机(如鼠标点击时)激活那一部分代码的执行。

结合前面的同步/异步更容易描述事件驱动的特征。同步时,小黄通过自己每隔一段事件查看一下妈妈有没有做好蛋糕来决定什么时候进行下一步活动(吃蛋糕/函数A),而异步时,小黄让妈妈做好蛋糕之后叫他,就相当于小黄把什么时候吃蛋糕这一事件发生的控制权交给了妈妈(函数B),而妈妈做好蛋糕之后叫小黄来吃这个动作就是callback回调(即前面所描述的异步通知)。这也表明了在Nodejs中事件驱动是异步的实现方式,而回调函数是事件驱动的实现方式

所以,说nginx是异步、非阻塞、事件驱动的服务器模型

以上是关于同步异步事件驱动的主要内容,如果未能解决你的问题,请参考以下文章

python网络编程04 异步与同步编程事件驱动

# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # SelectPollEpoll异步IO 以及selectors模块 # (示

理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO

python-- 事件驱动介绍阻塞IO, 非阻塞IO, 同步IO,异步IO介绍

事件驱动之异步事件

字符设备驱动程序之异步通知