0
点赞
收藏
分享

微信扫一扫

Python 处理并发中的重要概念

静鸡鸡的JC 2021-09-28 阅读 82

进程和线程

一个正在运行的程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。其中,线程是操作系统分配处理器时间片的最小单位。

进程间是相互独立的,一个进程无法访问另一个进程的数据,一个进程的失败也不影响其他进程的运行;进程间通信需要依赖管道、队列、信号量等技术。

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

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

  • Python 多线程适合做 IO 密集型程序,因为当一个线程遇到 I/O 操作时,将释放 GIL(全局解释器锁),因此效率更高。对于计算密集型程序,一般使用多进程,多进程可以发挥多核 CPU。
  • GIL 在较长一段时间内将会继续存在,但是会不断对其进行改进;不过可以使用 multiprocessing 替代Thread,或者使用协程,协程适合 IO 密集型,只用单核。

IO 密集型:涉及到网络、磁盘 IO 的任务都是 IO 密集型任务,这类任务的特点是 CPU 消耗很少,任务的大部分时间都在等待 IO 操作完成(因为 IO 的速度远远低于 CPU 和内存的速度)。常见的大部分任务都是IO 密集型任务,比如 Web 应用。

计算密集型:特点是要进行大量的计算,消耗 CPU 资源,比如计算圆周率、对视频进行高清解码等等,全靠 CPU 的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU 执行任务的效率就越低。所以,要最高效地利用 CPU,计算密集型任务同时进行的数量应当等于 CPU 的核心数。

同步和异步

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

异步与同步相对,调用者发出一个异步调用后,无需等待调用的结果,可以继续执行后续的操作。当异步调用完成后,使用状态、通知或回调来告知调用者。

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

阻塞和非阻塞

阻塞和非阻塞并不是由同步和异步决定的,描述的是程序在等待调用结果(消息、返回值)时的状态:

  • 阻塞是指调用结果返回之前,当前线程被挂起,线程只有在得到结果后才会返回。
  • 非阻塞是指即便不能立即得到结果,当前线程也不会被挂起。

并行和并发

并发并不是并行,真正的并行需要多个核心。现在的笔记本电脑有 4 个 CPU 核心,但是通常不经意间就会有超过 100 个进程在运行。

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

举报

相关推荐

0 条评论