Python并发编程:三个核心概念及Python并发编程模型

liftword5个月前 (01-24)技术文章51

前言

在正式进入Python并发编程的相关类库、语法的介绍之前,还是继续来对并发编程中的几个核心概念做进一步的阐述说明,从而在理念上对后续的学习有一个全局性的指导。同时,简单介绍一下Python中的并发编程模型,后续的关于Python并发编程的文章,将重点围绕并发编程模型进行展开。

本文的主要内容有:

1、并发编程中的三个核心概念

2、Python中的并发编程模型


并发编程中的三个核心概念

在上一篇文章中,我们简单介绍了并发和并行的概念,简单回顾一下:

1、并发是一个更加宽泛的概念,并发的概念中包含了并行的范畴,并行是并发的一种特殊形式。

2、并发可以是交替执行,也可以是同一时刻同时在运行。单个单核CPU,只能实现交替执行的并发。多核CPU或者多个CPU,才能实现同一时刻的并行。

3、由于分时复用的资源调度,以及流水线技术的存在,即使是单核CPU,也能实现广义上的并行,其实是指令执行阶段用到的不同CPU组件在并行工作。


本文要重点介绍的三个概念,分别是:程序、进程、线程。

我们写的代码从保存到硬盘到最终执行主要会涉及到以下过程:

1、代码编写完成后,以文件的形式保存在硬盘上,所以程序是静态的概念,就是我们编写的代码序列、源码文件。

2、程序开始执行之前,首先从硬盘加载到内存中,会创建对应的进程控制块(Process Control Block,PCB),用于标识进程的PID,进程相关的状态管理,进程所需要的内存资源的分配等。

3、每个进程会对应一个或者多个线程,每个线程同样会有对应的内存结构,叫做线程控制块(Thread Control Block,TCB)。用于标识线程的状态、调度线程的执行等。

4、每个进程中都会有一个线程为主线程,一般是我们代码中包含main()函数的入口文件,用于启动一个进程的执行。

5、如果进程中有多个线程,其他线程都是通过主线程的执行被不断创建、执行的。

6、操作系统中的进程/线程调度程序,负责基于相应的调度策略,给要执行的线程分配CPU资源,从而真正调度执行。

7、进程、线程执行完成,会销毁对应的PCB、TCB,回收相关的内存资源。如果涉及到内存空间不足时,还会涉及到需要把进程对应的内存临时置换到虚拟内存(其实是硬盘空间)中。下次被激活、调度执行时,再切换进入内存中。

对这个过程有个大概的了解即可,有感兴趣的,可以查阅相关的《操作系统》的书籍进行进一步深入学习。

一个完整的CPython进程大概是下图这样的,这里就不展开了。

基于以上的过程,我们再来简单区分一下程序、进程、线程这三个概念,我觉得有以下几点认知,暂时就足够我们进行后续的学习了:

1、程序是一个静态的概念,程序是储存在硬盘文件中的一行行代码的集合,可以简单对应为我们编写的源文件。

2、进程是一个动态的概念,进程有自己的状态管理、切换,进程从创建到销毁有一个生命周期的概念。进程是基于程序进行创建的,在内存中的一个数据结构。在操作系统的语义中,进程是资源分配的基本单位,这里面更加强调的是内存资源。

3、线程是一个动态的概念,线程可以理解为进程中的一个执行序列,线程是真正被动态执行的实体。每个进程可以有一个线程或者多个线程,每个进程都会有一个唯一的主线程,作为真正被CPU执行的入口序列。不同于进程作为内存资源分配的基本单位,线程是CPU资源分配的基本单位,也可以描述为调度执行的基本单位。


关于概念的基础,简单就聊这些,相信有上过《操作系统》课程的同学,应该有更加深入、全面的理解。


Python中的并发编程模型

接下来,从全局上简单介绍一下Python中的并发编程模型。

在Python中主要有4种并发编程模型,需要说明的是,我们是在CPython实现的语境中,其他Python实现可能会有一些差异。

1、Threading模型

多线程模型,对应到Python中的内置库是threading,这种模型可以支持并发,但是无法支持并行,主要原因在于GIL的设计。

2、Multiprocessing模型

从字面意义上,也就是多进程了,对应的Python内置库是multiprocessing,这种模型支持并发语义,同时也支持真正的并行。

3、Async模型

对应到Python中的内置库是asyncio,即异步IO的相关支持。这种模型也是只支持并发语义,而不支持并行。

4、Subinterpreters模型

对应到Python中的内置库是subinterpreters,Python子解释器的概念,相当于变相突破了GIL的限制。这种模型支持并发语义,也支持并行。

通过表格简单比较下这4种并发模型:

本文就先介绍到这里了,关于这些并发编程,在后面的文章中将会逐一展开。


总结

本文简单介绍了程序到执行的一个大概的过程,辨析了程序、进程、线程的概念,同时简单介绍了Python中的并发编程模型。

感谢您的拨冗阅读,希望对您有所帮助。

相关文章

Day 7: 异步编程——让你的 Python 高效无阻

当面对大量 I/O 密集型任务时,传统的同步编程可能会因等待外部资源(如网络请求、文件读取等)而导致性能瓶颈。而异步编程的出现,让我们可以一边等待外部资源一边继续处理其他任务,极大地提升了效率。今天的...

Python 30 天突破:函数基础深度剖析

在前四天的学习中,我们逐步构建起了 Python 编程的基础框架,掌握了多种数据结构与基本语法元素。今天,我们将踏入函数的世界,函数是 Python 编程中极为关键的组成部分,它能够让我们将代码模块化...

超实用!!!Python并发编程精髓(python3并发)

#小伙伴们,大家好!今天猿梦家要带大家探索的是Python并发编程的精髓。 在编写程序时,我们经常会遇到需要同时处理多个任务的情况,这时候并发编程就派上用场了。 通过并发编程,我们可以提高程序的运行效...

Python类编写的进阶之路:从入门到精通的五个层次

文章摘要本文深入探讨Python类编写的五个层次,从基本类创建到继承和方法重写、抽象类和多态等高级概念,结合代码示例和实践分析,帮助读者逐步掌握Python面向对象编程的核心技能,提升代码质量和可维护...

Python 编程,包含 Python 项目和 100 个测验

欢迎加入本次全面而系统的Python编程视频课程!无论你是编程新手,还是希望进一步提升Python技能的有一定基础的学习者,这门课程都将为你提供详尽的指导和实践机会。从安装Anaconda环境开始,一...

Python异步编程中信号处理的优雅之道

在Python编程中,我们会在各种需要与操作系统交互的场景中遇到信号(signal)。而在异步编程框架如 asyncio 中,我们如何优雅地处理和应对这些信号是一个重要的话题。这篇文章,我们就来深入探...