当前位置: 技术文章>> 详细介绍Python线程同步的实现

文章标题:详细介绍Python线程同步的实现
  • 文章分类: 后端
  • 28000 阅读

严格来说,在Python中,我们并不需要专门去实现线程同步,因为在Python中编写多线程程序时,无论是否手动给Python多线程程序加锁,在多线程程序运行时,都会被GIL所影响,使原本的线程不同步转变为安全的线程同步,不需要开发者额外手动进行处理。在本节中,笔者不会对Python中具体的线程同步实现原理进行介绍,而是对CPython官方实现Python线程同步以保证Python线程安全的整体概念和实现思路进行补充介绍。

Python线程同步指的是在多线程环境中执行任意一段Python代码(这段代码可以是一个方法,也可以是一个类,还可以是一个接口等),均能返回期望的结果。对于Python多线程环境下的资源竞争过程,笔者画了一张示意图,如图3-1所示。

假设在Python环境中同时存在线程A、线程B、线程C,且都需要执行同一个任务,假设这个任务的名称为T,这三个线程需要同时执行任务T,以达到多线程执行任务的目的。对于CPU来说,任一线程想要执行具体的任务,都需要CPU进行统一调度;对于线程来说,需要首先获取执行任务所需要的资源,才能开始执行。

在没有线程同步概念下,线程A、线程B、线程C在获取临界区中的资源时就会随机获取,甚至会出现都获取不到资源的情况,所以在图3-1的输出部分,笔者使用“线程?”的形式来描述在没有线程同步概念下,任务能不能被执行以及是否按照我们所设计的时序来执行都是不确定的。那么,在线程同步概念下,上述任务执行过程将会是什么样的呢?笔者也画了一张图,如图3-2所示。

在线程同步概念下,线程A、线程B、线程C访问临界区中资源的方式不变,只不过在任意时刻只能有一个线程可以获取到临界区中的资源。这里以线程A为例,线程A在获取临界区中的资源之后,就会以标记位的方式将临界区中的相关资源进行占有性标记。

在标记成功后,线程B、线程C都不能获取该资源。接着,线程A使用该资源继续执行任务,直到任务执行完毕,线程A才会释放资源。在线程A释放资源后,线程B或者线程C才能获取该资源,并执行后续任务。如此反复执行上述过程,直到所有的线程都获取该资源,并且任务均被执行完毕为止。

这是CPython官方在实现线程同步时使用的主要思路,并且将线程同步和线程安全放在一起实现,所以,读者在阅读本小节内容时,可以结合3.3.1节一起看。


推荐文章