Skip to main content
 Web开发网 » 编程语言 » Python语言

python线程及多线程实例讲解

2021年11月28日6450百度已收录

python线程及多线程实例讲解  python多线程 第1张

一、进程进程是程序的分配资源的最小单元;一个程序可以有多个进程,但只有一个主进程;进程由程序、数据集、控制器三部分组成。

二、线程线程是程序最小的执行单元;一个进程可以有多个线程,但是只有一个主线程;线程切换分为两种:一种是I/O切换,一种是时间切换(I/O切换:一旦运行I/O任务时便进行线程切换,CPU开始执行其他线程;时间切换:一旦到了一定时间,线程也进行切换,CPU开始执行其他线程)。

有需要Python学习资料的小伙伴吗?小编整理一套Python资料和PDF,感兴趣者可以关注小编后私信学习资料(是关注后私信哦)反正闲着也是闲着呢,不如学点东西啦

三、总结一个程序至少有一个进程和一个线程;

程序的工作方式:

单进程单线程单进程多线程多进程多线程考虑到实现的复杂性,一般最多只会采用单进程多线程的工作方式;

四、为什么要使用多线程我们在实际生活中,希望既能一边浏览网页,一边听歌,一边打游戏。这时,如果只开一个进程,为了满足需求,CPU只能快速切换进程,但是在切换进程时会造成大量资源浪费。所以,如果是多核CPU,可以在同时运行多个进程而不用进行进程之间的切换。然而,在实际中,比如:

你在玩游戏的时候,电脑需要一边显示游戏的动态,一边你还得和同伴进行语音或语言进行沟通。这时,如果是单线程的工作方式,将会造成在操作游戏的时候就无法给同伴沟通,在和同伴沟通的时候就无法操作游戏。为了解决该问题,我们可以开启多线程来共享游戏资源,同时进行游戏操作和沟通。

五、实例场景一:并发依次执行

python线程及多线程实例讲解  python多线程 第2张

如上图所示:有两个简单的函数,一个是听音乐一个是打游戏的函数。如果按照之前的单线程方式,将会是先运行完听音乐的函数再去运行打游戏的函数,最后打印Ending。如下图所示:

python线程及多线程实例讲解  python多线程 第3张

一共的运行时间是6秒。并且是只能单一按照顺序依次去执行。而使用多线时,运行时间是3秒,并且是并行执行。该情况下的多线程运行方式是,先创建线程1,再创建线程2,然后去启动线程1和线程2,并和主线程同时运行。此种情况下,若子线程先于主线程运行完毕,则子线程先关闭后主线程运行完毕关闭;若主线程先于子线程结束,则主线程要等待所有的子线程运行完毕后再关闭。该部分代码块:

python线程及多线程实例讲解  python多线程 第4张

场景二:主线程等待某子线程结束后才能执行(join()函数的用法)例如:在实际中,需要子线程在插入数据,主线程需要等待数据插入结束后才能进行查询验证操作(测试验证数据)

python线程及多线程实例讲解  python多线程 第5张

该部分代码块为:

python线程及多线程实例讲解  python多线程 第6张

线程守护(setDaemon()函数)前面不管是不是用到了join()函数,主线程最后总是要得所有的子线程执行完成后且自己执行完才能关闭(以子线程为主来结束主线程)。下面,我们讲述一种以主线程为主的方法来结束主线程。图1:无线程守护

python线程及多线程实例讲解  python多线程 第7张

图2:t2线程守护

python线程及多线程实例讲解  python多线程 第8张

所谓'线程守护',就是主线程不管该线程的执行情况,只要是其他子线程结束且主线程执行完毕,主线程都会关闭。也就是说:主线程不等待该守护线程的执行完再去关闭。注意:setDaemon方法必须在start之前且要带一个必填的布尔型参数七、自定义的方式来产生多线程

python线程及多线程实例讲解  python多线程 第9张

该部分代码块为:

python线程及多线程实例讲解  python多线程 第10张

Threading的其他常用方法getName() :获取线程名称setName():设置线程名称run():用以表示线程活动的方法(见七中自定义线程的run方法)rtart():启动线程活动is_alive():表示线程是否处于活动的状态,结果为布尔值;threading.active_count():返回正在运行线程的数量Threading.enumerate():返回正在运行线程的列表

python线程及多线程实例讲解  python多线程 第11张

该部分代码块为;

python线程及多线程实例讲解  python多线程 第12张

GIL:cpython解释器的'BUG'首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。在其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。GIL:global interpreter lock,全局解释器锁。

原文:

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

也就是说:无论有多少个CPU,开启多少线程,每次只能执行一个线程。基于此设计原理上,我们会觉得python的多线程其实完全没有用,如下图不开多线程执行的时间:

python线程及多线程实例讲解  python多线程 第13张

如下图开启多线程执行的时间:

python线程及多线程实例讲解  python多线程 第14张

好吧,前者是0.3秒,后者是20秒,这个结果是不是无法接受...........该部分代码块:

python线程及多线程实例讲解  python多线程 第15张

GIL原理:

python线程及多线程实例讲解  python多线程 第16张

python线程及多线程实例讲解  python多线程 第17张

线程同步锁1.为什么需要同步锁看下面例子,我们自定义一个减1的函数,初始赋值100,使用多线程,开启100个线程,那么期望的结果是最终结果为0,看下图:

python线程及多线程实例讲解  python多线程 第18张

该部分代码块为:

python线程及多线程实例讲解  python多线程 第19张

增加同步锁进行处理共同数据如下图:

python线程及多线程实例讲解  python多线程 第20张

该部分代码块如下:

python线程及多线程实例讲解  python多线程 第21张

有需要Python学习资料的小伙伴吗?小编整理一套Python资料和PDF,感兴趣者可以关注小编后私信学习资料(是关注后私信哦)反正闲着也是闲着呢,不如学点东西啦

评论列表暂无评论
发表评论
微信