python处理并发导读与目录

        在阅读Python处理并发的系列文章前,正确区分 进程/线程、并行/并发、阻塞/非阻塞、同步/异步 概念非常重要,是学习本部分内容的基础,也是面试中经常会被问到的内容。

一. 概念区分

1.1 进程和线程

        一个正在运行的程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。其中,线程是操作系统分配处理器时间片的最小单位。进程间是相互独立的,一个进程无法访问另一个进程的数据,一个进程的失败也不影响其他进程的运行;进程间通信需要依赖管道、队列、信号量等技术。

        线程是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含多个线程,多个线程共享主线程的资源,在进程开始执行的第一个线程被视为主线程。

        进程和线程在使用时需要注意的地方:

  • python多线程适合做io密集型程序,因为当一个线程遇到I/O操作时,将释放GIL(全局解释器锁),因此效率更高。如果是计算密集型程序,python中单线程因为没有线程切换的延时,效率将高于多线程。
  • 对于计算密集型程序,一般使用多进程,多进程可以发挥多核cpu。计算密集型程序来说,多进程效率 > 单线程 > 多线程。
  • GIL在较长一段时间内将会继续存在,但是会不断对其进行改进;不过可以使用multiprocessing替代Thread,或者使用协程,协程适合IO密集型,只用单核。
  • IO密集型:涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。常见的大部分任务都是IO密集型任务,比如Web应用。
  • 计算密集型:特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。

1.2 同步和异步

        同步是指发出一个任务调用时,必须等待任务执行完毕,才能返回或继续执行后续操作。即,同步就是必须等一件事情做完了之后才能去做下面一件。

        异步与同步相对,调用者发出一个异步调用后,无需等待调用的结果,可以继续执行后续的操作。当异步调用完成后,使用状态、通知或对调来通知调用者(状态:调用者需要轮询异步调用的执行状态,效率低;通知:异步调用完成后,发送通知给调用者,性能高;回调:类似于通知,当异步调用完成后,会调用调用者提供的回调函数)。

        总之,同步和异步的区别在于,调用发出后,是否需要等待结果,才能继续执行后续操作。

1.3 阻塞和非阻塞

        阻塞和非阻塞并不是由同步和异步决定的,描述的是程序在等待调用结果(消息、返回值)时的状态。阻塞是指调用结果返回之前,当前线程被挂起,线程只有在得到结果后才会返回。非阻塞是指即便不能立即得到结果,当前线程也不会被挂起。(注:同步一般会伴随阻塞,但也有可能没有阻塞;异步执行也有可能阻塞,也可能没有阻塞,总之,二者并无直接关系。)

1.4 并行和并发

       并发并不是并行,真正的并行需要多个核心。现在的笔记本电脑有4个CPU核心,但是通常不经意间就会有超过100个进程在运行。因此,实际上大多数程序都是并发处理的,而不是并行处理。计算机始终运行着100多个进程,确保每个进程都有机会取得进展,不过CPU本身同时做的事情不能超过4件。10多年前的设备也能并发处理100多个进程,不过都在同一个核心里。

       并行:当一个CPU执行一个线程时,另一个CPU同时在执行另一个线程,两个线程互不抢占CPU资源,是真正意义上的同时进行。因此,并行的数量取决于CPU内核的数量。

       并发:当多个线程在操作时,如果系统只有一个CPU,则它根本不可能同时运行一个以上的线程,它只能把CPU运行时间或分成多个时间片,在将时间片分配给线程执行。在一个时间片的线程代码在运行时,其它线程处于挂起状态,这种方式称之为并发。

二. 目录结构

python实现多进程(一) https://blog.csdn.net/Geroge_lmx/article/details/81176878  

python实现多进程(二) https://blog.csdn.net/Geroge_lmx/article/details/81838314

python实现多进程(三) https://blog.csdn.net/Geroge_lmx/article/details/81842829

python实现多线程(一) https://blog.csdn.net/Geroge_lmx/article/details/82049796

python实现多线程(二) https://blog.csdn.net/Geroge_lmx/article/details/82050009

python实现多线程(三) https://blog.csdn.net/Geroge_lmx/article/details/82082511

python实现IO多路复用(四) https://blog.csdn.net/Geroge_lmx/article/details/81160562

发布了132 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Geroge_lmx/article/details/105144020