> 文档中心 > Python语法进阶篇 - 66 - 线程与多线程概述

Python语法进阶篇 - 66 - 线程与多线程概述


万叶集
🎉 隐约雷鸣,阴霾天空。 🎉
🎉 但盼风雨来,能留你在此。 🎉

前言
✌ 作者简介:渴望力量的哈士奇,大家可以叫我 🐶哈士奇🐶 。(我真的有一只哈士奇)
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬
🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦


📕 系列专栏:
               👍 Python全栈系列 - [更新中]     【 本文在该系列】
                       🍎 Python零基础入门篇
                       🍎 Python语法进阶篇
               👋 网安之路系列
​                       🍋 网安之路踩坑篇
​                       🍋 网安知识扫盲篇
​                       🍋 Vulhub 漏洞复现篇
​                       🍋 Shell脚本编程篇
​                       🍋 Web攻防篇   2021年9月3日停止更新,转战先知等安全社区
​                       🍋 渗透工具使用集锦  2021年9月3日停止更新,转战先知等安全社区
​                ⭐️ 点点点工程师系列
​                       🍹 测试神器 - Charles 篇
​                       🍹 测试神器 - Fiddler 篇
​                       🍹 测试神器 - Jmeter 篇
​                       🍹 自动化 - RobotFrameWork 系列
​                       🍹 自动化 - 基于 JAVA 实现的WEB端UI自动化
                       🍹 自动化 - 基于 MonkeyRunner 实现的APP端UI自动化

Python语法进阶篇 - 66 - 线程与多线程概述 Python语法进阶篇 - 66 - 线程与多线程概述

文章目录

    • 线程与多线程的概念
      • 什么是线程
      • 线程与进程的关系
      • 多线程
      • 多线程的执行方式
      • 小节

线程与多线程的概念

在上一章节我们普及了进程与多进程的概念,我们也知道实际上我们启动的每一个软件都是一个个的进程。每一个进程都需要一定的 CPU 与 内存来帮助我们有充足的能量进行程序的执行。多个进程启动之后,相互之间不受影响,通过并行执行程序可以提高我们程序的执行效率。

但是看似完美的进程却是有一个问题,如果我们在一台硬件设施上启动了太多的软件(也就是进程),内存被分掉太多之后就会影响我们硬件的执行效率,甚至内存资源空了就会造成死机的情况。

那么有没有什么办法可以解决这个问题呢?今天要学习的 线程 或许就可以解决这个问题。为什么说 或许 ? 大家可以带着这个疑惑来学习接下来的 线程 相关知识,甚至是之后的知识,相信通过后面知识也可以帮助大家来解惑。

既然今天的主角是 线程 ,那么接下来我们就来看一下今天要学习线程的哪些知识。

什么是线程

其实说到线程,无论如何我们都是无法逃脱进程的。我们说过,每个软件或者每个程序都是通过创建一个进程开始的。所以这也就奠定了一个概念,先有进程,再有线程。

进程需要 CPU 与 内存 作为口粮和跑道,当进程调集了足够的资源后做了这样的一件事。它萌生出一个线程,而线程是具体负责我们程序真正执行的逻辑,所以线程才是真正执行我们业务逻辑的角色。

线程(Thread)是操作系统最小的执行单元,进程至少由一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。有些进程还不止同时干一件事,比如微信,它可以同时进行语音、发文字、浏览信息等事情。

怎样的任务才算得上是一个线程?进程被运行后算是一个线程,进程是不运行的,线程才会运行,而一个进程有多个线程就涉及到进程有多少可以被cpu单独调用的模块,这个调用的模块可以通过手动创建线程来建立。

线程与进程的关系

这里我们举一个例子:一个人就是一个进程,当一个人吃饱喝足了之后(可以理解为调用了足够的 CPU 与 内存 )就会精力充沛,尽力充沛的代表是哪里呢?我想灵活的大脑就是一个不错的代表,灵活的大脑有了充足的营养就可以帮助我们判断处理各种事情,而这里的大脑就相当于是 线程

所以进程提供线程执行程序的前置要求(吃饱喝足拥有足够的资源),而线程在拿到进程提供的资源后去执行程序。这就是 线程与进程之间的关系

多线程

和进程一样,线程也可以执行多个线程。同样的我们看一下下面的图片,这是一个我们常用的浏览器。当打开一个浏览器之后,会默认的弹出一个标签页窗口。我们知道打开一个浏览器的过程就是启动一个进程,获取了足够的资源(也就是 CPU 和 内存 ),然后通过主进程中的主线程来执行我们打开浏览器之后的业务逻辑帮助我们打开了默认的页面。

当我们打开了浏览器之后,有一些浏览器自带的按钮或者是输入网址的输入框。当我们输入了一个网址按下回车的时候,其实就是通过主进程的主线程来帮助我们完成的。当我们点击多个页面的时候,我们的主线程就会创建一个个新的子线程。每一个子线程都是一个浏览器的窗口,帮助我们打开一个个新的页面。

我们可以从截图中的浏览器看到打开了很多个页面,它们每一个都是当前浏览器的主进程中通过主线程创建的子线程,它们的每一个页面都在执行各自的业务逻辑并且相互之间也不会干扰,这就是多线程的概念。

其实不难看出,多线程与多进程非常的相似。只不过一个进程下的多个线程只会共享当前进程的内存资源,所以我们想一下,在一个进程中创建多个线程是否会比创建多个进程更加的节省资源呢?在某些情况下是的。我们作为初学先不要考虑太多的复杂场景,当下我们先只要认为多线程要比多进程更加的节省资源即可。随着我们未来的学习,对编程有了更加深入的理解之后,可能在更多的场景学习后,会对此结论有更多的改观。



多线程的执行方式

最后让我们来看一看多线程是如何执行的。



我们上一章节学习了 进程是如何在 CPU 下执行,而我们现在已经知道真正执行业务的其实是 线程 。从上图左边绿色的部分我们可以看出,一个进程中生成了多个线程。绿色方框代表进程,在它的体内创建了很多个线程;我们再看看右边的图片,它代表了一个 CPU 的核,也就是圆圈部分的红色 。

其实可以用另一个维度来看待,它可以是一个细长条,并且这个细长条被切割成了多个片段,我们把它叫做 CPU时间片。而每个线程就是在时间片上去工作的,大家可以看到当前的这个 CPU 的核被切割成了4片,这时候有4个线程进入工作了。每一个时间片都会去处理一个线程的业务,现在4个线程对应了4个时间片。如果再有一个线程进来,必然是没有足够的时间片让后来的线程使用了,就只能等待一会儿了。如果某个时间片里的线程执行完毕了,它就可以再去获取一个新的线程去执行。

我们把一个核心中在多个时间片上同时处理线程的行为叫做 "并发执行" 。这里一定要记住两个名次,多个CPU内核之间同时执行我们叫做 "并行" ;而单个内核之中多个线程同时工作,我们叫做 "并发" 。不过一般实际工作中,我们一般使用 "并发" 这个词来统称,而并发就代表着同时工作的意思。

无论是进程同时工作,还是线程同时工作。这只是名词上的称呼不同,并不需要过分的纠结。

小节

通过本章节的学习,我们了解到了 "线程是依赖于进程的" ,先有进程,才会有线程。并且进程中的主线程,还可以再去创建多个线程。这里大家可能会有一些疑问,我们该如何区分主线程与子线程的呢?其实很好理解,我们正常执行的脚本就是通过一个主进程下的主线程去完成的。

我们说过,在主进程下通过创建一些进程去做一些业务。那是主进程生成的子进程,其实严格的说也这是主进程下的主线程来帮助完成创建的。

该章节关于线程与多线程的理论知识我们就告一段落,从下一章节开始我们将学习如何通过 Python 来创建 多进程 与 多线程 。(我们会从多进程的相关知识学起,今天就先到这了吧。PS:o(╥﹏╥)o 难受啊…)