从锦囊妙计想到的17–同步和异步

很久都没时间写这个系列的东西了, 今天感觉还得继续下去,因此在继续继续一下, 今天要谈的是什么是同步, 什么是异步, 为了说明这个问题,先讲个故事,来说明一下 同步和异步的重要性!

 

一。 听对了,说对了, 不等于都对了!

先说一下, 甲对乙说了一句话, 甲说对了, 乙也听对了, 然后乙就去按照甲的意思去办理了, 那么乙一定能办对吗?当然假设乙在办理事情的过程中没有任何失误等等。

其实结果是大家 未必像大家想象的!

不啰嗦了,说故事。

本人现在在北京居住了很多年, 一天吃饭时, 家里发出了一个奇怪的声音, 于是我就去找一下, 别是什么电器什么坏了前兆, 若是发现了, 好及时修理。

找了几个地方, 都没找到, 于是我就说, 哪里来的声音?  一旁的老婆说了, 是南京大陆分吹过大陆架发出的声音。

我听后就特别奇怪, 我在北京怎么能听到 远在地球最南边的南极的声音?  我真要成为 顺风耳不成? 奇怪呀奇怪!

我不解的说着, 怎么可能是南极的声音, 一边说着一边转转过身, 然后我明白了!

原来老婆在看手机, 手机视频里面播放南极科考站的视频, 声音从视频里面传出来的!

结论:

  • 说对了, 听对了, 不等于都 达成一致的理解了, 很可能都理解错误了
  • 若是说错误了, 那么无论是否 听对, 最后都是错误的
  • 若是 说对了 , 听错误了, 最后 也可能是错误的
  • 说对了, 听对了, 都理解对了, 但是最后做的时候错误了, 那么结果也是错误的!

上面列举的 当有一个说的人, 一个听的人时,  要把一件事情弄好的  一个情况。 可以看到各种情况下都是错误的。

若是人更多, 事情更多, 就更容易错误了!

 

二。错误有什么损害?

这个问题,错误的损害, 没办法直接说, 还是讲个故事

一天, 老张去菜市场去买肉, 老张来到 菜市场卖肉的地方, 前面还有几个人在买肉, 老张在后面等着, 前面的人也买肉,前面的人说这个堆是什么肉呀, 卖肉的人说是猪肉, 然后前面的人买了走了, 过了一会,轮到老张了(前面卖肉后, 卖肉整理了肉案子, 因此一部分肉更换了位置), 老张听到了前面的人说的是猪肉, 于是说来二斤这个肉, 卖肉的称了二斤肉给老张, 老张付了钱回了家, 结果回家老婆一看, 怎么卖了2斤羊肉?  家里没人吃羊肉!自然老张要挨一顿。。。

类似的故事大家可以直接编写自己的版本了,

例如, 本来要买个玩具猪, 但是由于理解错误, 最后买头猪的情况,是否可以编出来!

类似的很多很多!

类似的 生活中的事情很多, 很多, 错误了, 不是闹出笑话就是, 有经济损失, 或者伤害等等, 那么如何避免错误的发生呢?

这个问题后面给出一个不完美的解决办法, 因为没有真正完美的东西, 因此仅仅能给出一个不完美的解决办法来!

 

三。总结一下做事情的过程

总结这个过程, 说了很多, 也未必真正明白, 还是画个图来说明一下!

图1   一般工作过程

如上图, 我们让别人做一件事情时 , 只要包括:   发布人,   执行人

发布人,   发布任务, 或者安排事情, 安排工作, 发布命令, 等等, 你能理解的各种词汇都可以 , 总之明白这个意思就好

执行人,   执行任务, 或者做任务, 做事情, 做任务等等, 都可以。

 

通常的过程是:

过程1:

 

发布人=》1)要求任务 执行人 ,  执行一项任务=》2)执行人接收任务=》3)进行相关工作=》4)把工作成果或者工作结果给发布人=》5)发布人同意完成工作。

本过程可以参考图1中的一般工作过程, 描述的就是这个工作过程。

 

过程2:

这里有一些情况类似但是, 缺少最后的5), 情况如下:

发布人=》1)要求任务 执行人 ,  执行一项任务=》2)执行人接收任务=》3)进行相关工作=》4)把工作成果或者工作结果给发布人(完成了)

下面来讨论一下过程2

对于过程2,   任务的发布人,  不会知道 , 任务执行人是否做了, 更不可能知道  是否对了, 因为, 任务发布人不要求知道结果, 那么一切就靠   执行人自己了! 参考如下图

这个过程, 一般来说不是很好, 由于不知道结果情况, 因此最后的情况无法预计, 好的情况是 一切都很好, 坏的情况是, 什么事情都没做, 你还不知道。

当然这个流程2  , 唯一的好处是, 由于少了一个环节, 因此可能进行的比较快, 因此在非常不关心后果的情况下, 事宜采用他。

 

四。计算机中的任务调用

计算机中, 通常会把执行一定的功能的代码或者指令(就是我们前面说的锦囊)封装的一个大的袋子里面, 并且给这个大的袋子 起个名字, 通常这个大袋子就是函数(通俗的也可以教子函数, 子程序, 过程,方法的, 总之尽管略有差别, 但是大体上是一个东西)了。

有了这个函数, 就可以让别人 使用这个函数了!

函数的使用者(函数的调用者, 同任务的发布者类似), 调用函数(发布任务), 然后执行函数(执行者在执行函数),这个过程同上面的 做事情是极其相似的。

那么是否需要确保执行事情时, 或者在计算机里面确保函数调用执行结果正确, 是非常有必要的。

一个函数执行结果错误会造成重大问题, 很有可能的,  前面已经用多个故事说明 执行结果不正确带来的重大问题

下面是一个非常严重的计算机故障造成的问题:

http://www.sohu.com/a/130983799_670543

从上面 可以看到,  计算机故障引起的重大故障。

因此, 当你在你的程序中调用别的函数时, 一定要确认 那个函数返回的是否是正确的, 然后在根据结果决定后续的工作。  当然这个就能避免 不出问题吗?  前面也说了, 不能。

但是, 检查肯定比 不检查要好的得多。

计算机领域现实生活
函数使用者任务发布者
函数调用者任务发布者
函数执行者(cpu或者程序)工作者,执行人
函数工作、任务等

上面表格简单类比了  生活中的 做事情,同计算机中的调用的关系, 也说明了 调用不正确造成的 危害。

那么如何避免或者减少这些危害?

 

五。 通过明确的结果检后进行补偿减少损失

上面说了不检查结果或者, 发布任务后可能造成很多问题, 尽管他仅仅是个可能, 但是仍然是问题, 一旦发生就会有非常大的危害

如上图,

任务发布人, 发布了一个任务后, 等待执行者去执行, 等执行者执行完成后, 把结果给 任务发布人后, 有任务发布人   立即   检查结果,  并根据检查后结果进行后续工作。 例如经过了检查 执行结果符合原来预期, 然后执行正常后续的事情。  若是检查到 执行结果不符合原来的预期, 那么就要进行补偿的一些事情了, 通过补偿来减少问题的损失等

一般来说, 这种 有发布者自己 通知别人进行相关工作, 并且等待执行完成, 并且  立即  亲自  检查执行结果的调用方式, 叫做同步调用, 一般用Synchronous表示, 如下图

 

相对应的是 异步调用。 什么是异步调用, 主要就是 同步以外的其他调用是  异步调用, 这个不是个准确的定义,

上图是一个典型的异步调用。  请特别注意 图中所示, 发布完成任务后, 可以做别的事情, 然后执行完成后会把结果通过一定方式通知到发布者。 这个时候发布者未必有时间或者有机会处理结果, 需要等待一定时间后再进行结果的处理工作。

这个异步处理方式中,  若是需要工作方面的补偿或者重做, 那么可能有一定的麻烦, 主要是程序的运行条件已经发生变化了! 因此异步是有一定风险的。

 

六。 单线程和同步调用

什么是单线程, 什么是 单cpu?

程序的执行是通过cpu进行的, 没有cpu就没有计算机了, 我们手机中有cpu, 我们硬盘中也有控制器, 其实也是个cpu。

cpu执行指令时, 是按照程序自己指定的顺序进行的执行的, 当然有分支, 也有循环, 但若是按照cpu执行指令的顺序, 并且把每条执行的过程都串到一起, 就会形成一个线索。 这个线索就是一个线程。

一个计算机中若是有多个cpu就可以同时有多个执行线索。  程序可以让自己的程序,启动多个线索来执行不同的任务,这个就是多线程。

计算机中, 网卡, 硬盘等等, 里面都有可编程的芯片,这些芯片基本上可以认为是cpu,因此你电脑上别看仅仅一个cpu但是其实可能是暗含多个类似的cpu的

因此我们说单纯,或者纯粹的单线程就是不能让其他设备同这个线程有相同的工作情况。

如上图, 每个蓝色矩形  代表一个cpu的指令或者一条程序(一般一条程序代码会分解为若干条指令, 简化认为是一条指令)。

从上图由于只有一个线程或者只有一个cpu,因此同时仅仅能做一件事情(复杂情况例外,以后会讨论到)。因此在只有一个cpu是仅仅能做出一个同步的调用。

 

七。网卡或者io的单cpu情况

在计算机上通过网卡进行网络通信时, 可能采用下面的形式, 这个形式就不是同步的了

如上图 核心的事情是 发布者 在发布一条任务给网卡后, 自己可以继续进行后续的其他工作, 而网卡接收工作后, 自己可以不依赖于cpu,然后自己根据数据等进行自行的工作, 等工作完成后,在返回结果给 cpu(程序)

这个工作过程就是典型的  异步操作。

除了网卡, 磁盘io也可以有类似的情况。

特别注意, 网卡, 磁盘等都可以有同步的方式进行通信的, 这里特别举出的是 异步的。

 

同步和异步就到此, 后续有时间在慢慢补充。

 

相关文章

计算机介绍                                  从锦囊妙计想到的01

流程图(分支结构)介绍          从锦囊妙计想到的02

线程介绍                                     从锦囊妙计想到的03

循环结构介绍                             从锦囊妙计想到的05

流程线程总结                             从锦囊妙计想到的06

cpu和线程定义、开始               从锦囊妙计想到的07

分布式计算                                  从锦囊妙计想到的08

分布式中事件和计数                 从锦囊妙计想到的09

内容总结                                     从锦囊妙计想到的10

数据类型,变量简介                从锦囊妙计想到的11

函数和参数                                从锦囊妙计想到的12

用户交互与数据输入输出       从锦囊妙计想到的13

人机交互界面                            从锦囊妙计想到的15 

过程与对象                                从锦囊妙计想到的16

同步和异步                                从锦囊妙计想到的17

顺序打印                                    从锦囊妙计想到的18

数据输入输出                            从锦囊妙计想到的19

屏幕坐标和打印                        从锦囊妙计想到的20

java函数控制输出                     从锦囊妙计想到的21

逐步细化解决复杂问题           从锦囊妙计想到的22

java入门                                    从锦囊妙计想到的23

java复杂过程分析                   从锦囊妙计想到的25

中间辅助功能解决问题          从锦囊妙计想到的26

叠加操作输出复杂图形          从锦囊妙计想到的27

时间和空间                               从锦囊妙计想到的28

编写边测解决问题                  从锦囊妙计想到的29

让程序动起来                          从锦囊妙计想到的30

程序往复运动                           从锦囊妙计想到的31