网络编程几个概念解析
一、串行与并行
串行与并行一般说的是程序的执行方式。
串行是什么呢,它是同步线程的实现方式,就是任务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自动切换(切之前保存状态)