网络编程几个概念解析

一、串行与并行

  串行与并行一般说的是程序的执行方式。

  串行是什么呢,它是同步线程的实现方式,就是任务A执行结束才能开始执行B,单个线程只能执行一个任务,就如单行道只能行驶一辆车。

    

二、同步与异步

  同步与异步一般说的任务的调用方式。

  同步调用:提交完任务后,在原地等待任务执行完毕,拿到返回值,再执行下一行代码,只存在一个线程。

  异步调用:多个任务情况下,一个任务A正在执行,同时可以执行另一个任务B。任务B不用等待任务A结束才执行。存在多条线程。一般情况下,异步调用与回调机制一起使用。

  

三、并发与并行

    

  并发和并行其实是异步线程实现的两种形式。并行其实是真正的异步,多核CUP可以同时开启多条线程供多个任务同时执行,互补干扰,如上图的并行,其实和异步图例一样。但是并发就不一样了,是一个伪异步。在单核CUP中只能有一条线程,但是又想执行多个任务。这个时候,只能在一条线程上不停的切换任务,比如任务A执行了20%,任务A停下里,线程让给任务B,任务执行了30%停下,再让任务A执行。这样我们用的时候,由于CUP处理速度快,你看起来好像是同时执行,其实不是的,同一时间只会执行单个任务。

  并发编程包指在同一时间执行多个任务。又包含并行,和并发。并发不一定并行,但并行一定并发 。

  并发:是伪并行,即看起来是同时运行,在程序执行过程中,不停的在进行切换。单个cpu+多道技术就可以实现并发,(并行也属于并发)

  并行:同时运行,只有具备多个cpu才能实现并行。

      

  多道技术概念回顾:内存中同时存入多道(多个)程序,cpu从一个进程快速切换到另外一个,使每个进程各自运行几十或几百毫秒,这样,虽然在某一个瞬间,一个cpu只能执行一个任务,但在1秒内,cpu却可以运行多个进程,这就给人产生了并行的错觉,即伪并发,以此来区分多处理器操作系统的真正硬件并行(多个cpu共享同一个物理内存)

三、阻塞与非阻塞

  阻塞与非阻塞一般说的是程序状态!

  程序处于阻塞状态意思是说:当前进程被操作系统剥夺了CPU的执行权限。

  同步调用与阻塞区别:

  阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

# 例子1:
# 同步调用:apply一个累计1亿次的任务,该调用会一直等待,直到任务返回#结果为止,但并未阻塞住(即便是被抢走cpu的执行权限,那也是处于就绪态);

#阻塞调用:当socket工作在阻塞模式的时候,如果没有数据的情况下调用#recv函数,则当前线程就会被挂起,直到有数据为止。

 总结:

#1. 同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。
  而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。
#2. 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程

四、其他

  程序的执行:
    串行执行:串行不意味着效率低,程序如果是纯计算的话,串行执行并没有效率问题
  串行的问题:IO密集型程序串行运行,效率极低

  并发执行(并行执行):开启多进程或多线程并发执行,彼此互不干扰
  ps:python的多线程在IO密集型程序中是有用的(GIL)

  并发的问题:不能无限制地开启多线程或多进程

  解决:进程池或线程池
  思路:将进程或线程控制在一定数量内(计算机可承受的范围)
  进程池或线程池的问题:池的大小需要跟着任务规模的增大而调高,如果任务数过多,池返回会降低效率


  最终:如何解决IO问题成了关键


  任务的调用方式:
  同步调用:提交完任务后,在原地等待任务执行完毕,拿到返回值,再执行下一行代码
  异步调用+回调机制:
    提交完任务(捆绑一个回调函数)后,不等待任务的执行,直接执行下一行代码
  然后等到进程有结果直接出发回调函数的执行

  区别阻塞的概念:
    阻塞指的是进程的一种状态:在进程遇到IO时,会被操作系统剥夺走CPU的执行权限


  最终:需要寻找一种解决方案,需要同时具备以下几点
  1、检测单线程下的IO
  2、遇到IO自动切换(切之前保存状态)

posted @ 2017-11-09 16:27  看雪。  阅读(221)  评论(0编辑  收藏  举报