并发,同步,异步以及事件驱动编程的相关技术

Table of Contents

并发,同步,异步以及事件驱动编程的相关技术

前言

这篇文章的存在主要是因为本屌才疏学浅,会的东西实在有限,作为本屌的学习之用,如果有前辈能指正一二,本屌将不胜感激!因为本屌一直觉得代码还有API其实不难,也没有想象的那样重要,本屌一直觉得掌握思想才是王道,明白原理才是高手,其实这一点见解也是本屌观察社会发现的,微软为啥挣钱,他开发的软件也不多啊,安卓为啥火啊,好的公司几乎没有专门为别人开发软件的.本屌愚见!

下面我们先来说说并发,同步和异步这三个概念

并发

第一个案例

有一天你和你喜欢很久的女神约啪了,你很开心,回家之后得补补啊,但是回到家还是你自己啊,你得自己做饭啊,你先烧水,在烧水的过程中,你出去买了一包小咸菜,还有两个馒头,一瓶老干妈,一瓶小酒.你心想啊,得吃点肉啊,要不买个鸡吧?就买了一个鸡,你回家开始做饭,这个时候水正好开了,你把鸡放进去开水了开始煮,为了节省时间,你在煮鸡的时候,又把老干妈打开,小咸菜放在盘子里,热了一下馒头,鸡还没熟,你又给你女神打了一个电话说你在做饭,结果你女神告诉你还是你下面好吃,(别想多了)...

好了,我YY完了,上面描述的整个你得一系列动作,他们都可以独立的进行,这些任务都是为了达到某种特定的目的,他们之间是不能相互替代替换的,但是在实际操作里你并不是等待某个人物做完了再去做另一个任务,而是运用统筹的方法,交叉进行,这么做的好处就是效率高了,节省时间了,其实最简单的案例就是平常你看这片,并且在做手部运动的时候,其实你可以先看片,完事之后,在做手部运动...

第二个案例

现实生活里还有一种并发,例如我们在食堂里吃饭,去食堂吃饭的人很多,因此食堂开启了好几个打饭的窗口,如果打饭的窗口开的越多,那么吃饭人打到饭所用时间也就最少,如果每个食客都有一个窗口一对一的服务,那么食客基本就不用浪费任何时间去等待了,这种vip感在中国这么资源紧张的国家里,简直太爽了,这是食堂打饭的并发.

分析

是不熟觉得我这两个案例多此一举了,他们其实本质是不同的,第一个案例其实是一个人的并发,第二个案例其实是多人的并发,用计算机的概念描述就是前一个例子是一个线程的并发,后一个案例就是多线程完成的并发,第一个案例的线程载体是做饭的人,第二个线程的载体是每个打饭窗口的工作人员,一般情况下,并发就是多线程,一个线程怎么可能做并发了,但是例子一说明一个线程是可以做并发的.

so,并发的概念由此可以得出:冰法就是让一系列独立的任务同时执行,同时执行包含两种情况,一种是完全独立执行,例如在拥有双核CPU的计算机里,每个CPU在同一时间处理不同的任务,另一种情形是一个任务还没执行完,而CPU计算被闲置的时候CPU用来处理别的任务.

而现实里我们要做到高效的并发就得把这两种模式的并发混合起来,食堂打饭的案例就是混合了两种模式的并发,对于计算机两种模式的并发才能把计算机的计算能力深度挖掘.

接下来就要谈谈同步和异步两个概念了,

同步

在计算鸡领域同步应该是指相互独立的任务一个接着一个运行,拿上面做饭的案例描述就是你得等着烧开了水才能出去买东西,鸡肉煮好了才能和女神通电话,女神才能夸你下面好吃.很明显同步的方式在现实生活里的效率很低下,不过通过有个很大的好处就是简单啊,简单的理论基础就是一次做一件事情,做的时候一心一意专心致志.

异步

下面说说异步的概念,同步和异步在当代的计算机领域里是两个对等的概念,但是如果我们要追溯异步的本质,就会发现其实是一个因果关系,同步是因,异步是果,换个说法同步是异步的父类,所以我们要正确理解异步就要明白同步做不好的事情,在web前端有个鲜活的案例可以说明这个问题,这个案例就是ajax,在ajax出现之前,浏览器的一个独立页面和服务器的交互式通过一个socket进行的,这个socket相当于一个县城,它是采用同步处理的方式,所以没有ajax的时代,单独页面每次和服务端的交互都只能做一件事情,而网络处理的速度往往是最慢,而且网络的效率很容易受到外界影响,因此同步请求会导致用户使用页面的体验不好,同步网站时刻都在考验着用户的耐心,这就导致了ajax的出现,ajax本质就是浏览器提供了一个新的socket连接,这个socket是有别于同步的socket,它可以独立于同步socket运行,有了ajax这个socket我们就可以在不影响页面同步操作的前提下也能从服务端获取数据,这就好比 浏览器由原来一个人完成和服务端的交换变成了现在两个人和服务端的交互操作 , 它们各司其职,共同完成页面上的功能.

异步和并发的关系和区别

一步操作和并发看起来很像,特别是和我前面说的做饭的案例很像,的确并发和异步常常交织在一起,但是他们还是有很大的区别的,这个区别在于他们所达到的业务目的, 并发的业务含义是能做更多事情 ,而异步是让多个人共同完成一个任务,异步其实是通过专业角度吧一个大任务差分成相对独立的小任务,让更加专业的人完成这个小任务,小任务完成后最后汇总成一个大任务的结果.

异步和并发共同点是都是通过多线程来实现,通过他们在业务场景的区别,我们反过来学习多线程,就知道多线程能为我们做好哪些事情,那么当你碰到需要使用多线程的业务场景就知道按照什么思路来分析这个业务场景了.

关于事件驱动编程

全世界最熟悉事件驱动的程序员应该就是前端工程师了,不管是桌面前端还是web前端都是世界上最熟悉事件驱动的,以web前端为例,我们作业面可以不去想什么面向对象编程,什么jQuery框架咋用,但是为按钮,为页面元素添加相关事件操作肯定是不可缺少的,而web前端的事件处理机制就是标准的事件驱动机制,为了讲解清楚事件驱动,这里我回顾下页面里事件机制,我们开发页面事件的时候,第一步就是定一事件(定义时间就是在定义一个函数)或者说为事件定义一个动作,并把事件绑定到指定的元素上,如果我们没有触发函数上事件,那么定义好的函数也就不会执行,如果元素上的事件被触发了,定义好的函数才会执行.

关于浏览器里事件机制实现方案,具体如下:

首先我要说多线程开发里有一个经典的设计方法,这个方法就是生产----消费模式,生产----消费模式特点就是生产者和消费者被一个中间队列分隔开来,不管是生产请求还是消费结果都是通过这个中间队列,这样就可以把生产者和消费者关系解耦,事件实现机制从宏观上和生产----消费模式类似,这个类似不是指设计思想,而是指沟通双方联系的哪个中间层.

事件处理的机制里应该有个事件处理器,事件处理器位于元素和事件处理方法的中间位置,我们在定义事件的时候就是等于在实践处理器里定义元素和事件处理方法的关系,当这种对应关系定义好后,事件处理器就会启动一个死循环,这个循环反复检测元素的状态变化,当事件处理器发现,某个状态发生了变化,处理器就会找到相应的事件处理方法,然后执行这个方法.

传统语言做开发的时候都是按照时间的先后顺序,这么做既可以降低语言的学习成本,也可以让开发代码思路比较容易控制,但是现实场景是复杂的,这种按时间顺序的开发流程并不一定是我们解决现实问题的最佳方式.这就好比我们做一件事情,在做的时候我们会碰到很多问题,由于发生的问题不同,那么这件事情的结果可能就会因为情况的不同而发生变化,如果按照时间顺序的变成方式向做好上面的事情就会让程序变得十分复杂,因为我们要按照时间顺序做出各种不同执行路径,这就是排列组合的办法了,这显然让事情变得复杂了,如果用事件驱动变成方式,我们只要定义好事物的起因,各种不同的过程情况,以及所能得到的结果,换句话说我们首先只要关注实体内容而忽略事务关系问题,而事务关系则是在事件处理器里定义的,当我们发送给事件处理器一个指示信号,处理器就会对应找到某个行为,那么事件驱动编程就简化了程序开发的流程.

小小的结一下

这篇文章出现的目的是为了解释上一篇的各种不明白的单词,希望大家看完之后能好好学习.

①拖延;②缺乏计划;③无止尽的焦虑。行动前思考是对的,但焦虑中的反复思考却可能成为浪费时间的代名词。④接收太多不必要信息。如果让所有信息都涌进大脑,会导致难于清晰思考。⑤周末赖床。周末是难得自由的时间,合理规划,它将给你巨大的收获。

0 评论

发表评论

精品游戏◆乐于分享


Title