学Python的漫画漫步进阶 -- 第十六步

news2024/12/23 15:58:33

学Python的漫画漫步进阶 -- 第十六步

  • 十六、多线程
    • 16.1 线程相关的知识
      • 16.1.1 进程
      • 16.1.2 线程
      • 16.1.3 主线程
    • 16.2 线程模块——threading
    • 16.3 创建子线程
      • 16.3.1 自定义函数实现线程体
      • 16.3.2 自定义线程类实现线程体
    • 16.4 线程管理
      • 16.4.1 等待线程结束
      • 16.4.2 线程停止
    • 16.5 动动手——下载图片示例
    • 16.6 练一练
    • 16.7 多线程总结
    • 全部16步学习完成 ,后续就是介绍项目实战,请大家给予点赞、关注,绝对超值!

十六、多线程

如果想让我们的程序同时执行多个任务,就需要使用多线程技术了。到目前为止,我们编写的程序都是单线程的,在运行时一次只能执行一个任务。

Python多线程是指从软件或者硬件上实现多个线程并发执行的技术。在多线程中,一个程序可以划分为多个独立运行的线程(也称为轻量级进程),这些线程可以并行执行,从而提高程序的执行效率。

多线程的优点在于可以充分利用多核CPU资源,同时执行多个任务,特别是在等待I/O操作(如用户输入、文件读写和网络收发数据等)时,线程可以释放一些珍贵的资源如内存占用等。此外,多线程还可以用于实现并发执行的任务,如网络爬虫、文件批量处理等。

在Python中,多线程相关的模块主要有ThreadThreadingQueue等。其中,Thread是底层支持模块,不建议使用。Threading模块对Thread模块进行了封装,实现了线程的一些操作对象化。而Queue模块则实现了多生产者、多消费者的队列模式,可以方便地在多线程中使用。

需要注意的是,多线程编程也存在着一些问题。首先是线程安全问题,如果多个线程同时访问共享数据,可能会导致数据竞争或冲突的问题。其次是线程同步问题,如果多个线程之间存在依赖关系,需要按照一定的顺序执行,就需要使用线程同步机制来确保正确地执行顺序。此外,多线程的开销也比较大,因为每个线程都需要分配和管理自己的栈空间等资源,所以在实际应用中需要注意控制线程的数量和开销。

总之,Python的多线程编程是一种有效的技术,可以有效地提高程序的执行效率和响应速度。但是在实际应用中需要注意线程安全和线程同步等问题,并合理控制线程的数量和开销。

在这里插入图片描述

16.1 线程相关的知识

本节先介绍线程相关的知识。

16.1.1 进程

一个进程就是一个正在执行的程序,每一个进程都有自己独立的一块内存空间、一组系统资源。在进程的概念中,每一个进程的内部数据和状态都是完全独立的。
在Windows操作系统中,一个进程就是一个exe或者dll程序,它们相互独立,相互也可以通信。

16.1.2 线程

在一个进程中可以包含多个线程,多个线程共享一块内存空间和一组系统资源。所以,系统在各个线程之间切换时,开销要比进程小得多,正因如此,线程被称为轻量级进程。

16.1.3 主线程

Python程序至少有一个线程,这就是主线程,程序在启动后由Python解释器负责创建主线程,在程序结束后由Python解释器负责停止主线程。
在多线程中,主线程负责其他线程的启动、挂起、停止等操作。其他线程被称为子线程。

在这里插入图片描述

16.2 线程模块——threading

Python官方提供的threading模块可以进行多线程编程。threading模块提供了多线程编程的高级API,使用起来比较简单。
在threading模块中提供了线程类Thread,还提供了很多线程相关的函数,这些函数中常用的如下。
在这里插入图片描述
active_count():返回当前处于活动状态的线程个数。

current_thread():返回当前的Thread对象。

main_thread():返回主线程对象。主线程是Python解释器启动的线程。示例代码如下:
在这里插入图片描述

通过Python指令运行文件:

在这里插入图片描述

16.3 创建子线程

创建一个可执行的子线程,需要如下两个要素。

1 线程对象:线程对象是threading模块的线程类Thread或Thread子类所创建的对象。

2 线程体:线程体是子线程要执行的代码,这些代码会被封装到一个函数中。子线程在启动后会执行线程体。实现线程体主要有以下两种方式。

1)自定义函数实现线程体。

2)自定义线程类实现线程体。
在这里插入图片描述

16.3.1 自定义函数实现线程体

创建线程Thread对象的构造方法如下:
在这里插入图片描述
target参数指向线程体函数,我们可以自定义该线程体函数;通过name参数可以设置线程名,如果省略这个参数,则系统会为其分配一个名称;args是为线程体函数提供的参数,是一个元组类型。
示例代码如下:

在这里插入图片描述
在这里插入图片描述

通过Python指令运行文件:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

16.3.2 自定义线程类实现线程体

另外一种实现线程体的方式是,创建一个Thread子类并重写run()方法,run()方法就是线程体函数。
采用自定义线程类重新实现16.3.1节的示例,示例代码如下:
在这里插入图片描述
在这里插入图片描述

16.4 线程管理

线程管理包括线程创建、线程启动、线程休眠、等待线程结束和线程停止,其中,线程创建、线程启动和线程休眠在16.3节已经用到了,这些不再赘述。本节重点介绍等待线程结束和线程停止的内容。
在这里插入图片描述

16.4.1 等待线程结束

有时,一个线程(假设是主线程)需要等待另外一个线程(假设是t1子线程)执行结束才能继续执行。
在这里插入图片描述
join()方法的语法如下:
在这里插入图片描述
参数timeout用于设置超时时间,单位是秒。如果没有设置timeout,则可以一直等待,直到结束。
使用join()方法的示例代码如下:
在这里插入图片描述
通过Python指令运行文件:

在这里插入图片描述
从运行结果来看,在子线程t1结束后,主线程才输出变量value的内容,这说明主线程被阻塞了。
如果尝试将t1.join()语句注释掉,则输出结果如下:

在这里插入图片描述
从运行结果可见,子线程t1还没有结束,主线程就输出变量value的内容了。

在这里插入图片描述

16.4.2 线程停止

在线程体结束时,线程就停止了。但在某些业务比较复杂时,会在线程体中执行一个“死循环”。线程体是否持续执行“死循环”是通过判断停止变量实现的,“死循环”结束则线程体结束,线程也就结束了。
另外,在一般情况下,死循环会执行线程任务,然后休眠,再执行,再休眠,直到结束循环。
在这里插入图片描述

示例代码如下:

在这里插入图片描述
通过Python指令运行文件:

在这里插入图片描述

16.5 动动手——下载图片示例

在这里插入图片描述

这个网络爬虫程序每隔一段时间都会执行一次下载图片任务,在下载任务完成后,休眠一段时间再执行。这样反复执行,直到爬虫程序停止。
示例参考代码如下:

在这里插入图片描述

本示例从服务器下载图片,因此需要参考14.2节启动Web服务器,
然后通过Python指令运行文件:

在这里插入图片描述

在这里插入图片描述

16.6 练一练

1 请简述如何创建线程体。

2 请简述线程中join()方法的作用。

3 下列哪些情况可以停止当前线程的运行?()
A.引发一个异常时。

B.当该线程调用sleep()方法时。

C.当创建一个新线程时。

D.当该线程调用stop()方法时。

4 判断对错(请在括号内打√或×,√表示正确,×表示错误)。
1)线程对象是threading模块线程类Thread或Thread子类所创建的对象。()

2)实现线程体主要有以下两种方式:自定义函数实现线程体和自定义线程类实现线程体。()

3)在线程体结束时,可通过调用stop()方法停止。()

4)在线程体结束时,可通过调用join()方法停止。()

16.7 多线程总结

Python多线程是一种在程序中实现并发执行的技术,它允许同时执行多个线程,从而提高程序的运行效率。在Python中,多线程编程可以使用threading模块或concurrent.futures模块来实现。下面是关于Python多线程的总结:

  1. 多线程的概念和原理

多线程是指在一个程序中同时执行多个线程,以充分利用多核CPU资源,提高程序的运行效率。多线程的原理是将程序划分为多个子任务或线程,每个线程并行执行,从而加快程序的执行速度。在Python中,多线程编程可以使用threading模块或concurrent.futures模块来实现。

  1. 线程的创建和管理

在Python中,可以使用threading.Thread()方法来创建一个新线程。创建线程时,需要传入一个可调用对象(即线程要执行的任务)作为参数。当线程被创建后,可以调用start()方法来启动线程,调用join()方法等待线程执行完毕,以及调用is_alive()方法来判断线程是否仍在运行。

  1. 线程安全和线程同步

在多线程编程中,需要注意线程安全和线程同步的问题。线程安全是指在多线程环境下,数据访问不会出现冲突或竞争的情况。如果多个线程同时访问同一个数据,就可能会出现数据竞争或冲突的问题。为了解决这个问题,可以使用同步机制(如互斥锁)来确保在同一时间只有一个线程可以访问共享数据。

  1. threading模块和concurrent.futures模块的比较

Python的threading模块是标准库中的多线程库,使用起来比较简单,但是它不支持异步执行和线程池的概念。相比之下,concurrent.futures模块则提供了更强大的功能,它支持异步执行和线程池的概念,可以更好地管理多线程的执行。

  1. 多线程编程的适用场景

多线程编程适用于需要并发执行多个子任务的场景,特别是当这些子任务之间没有依赖关系,可以并行执行时。例如,在一个网络爬虫程序中,可以使用多线程同时爬取多个网页;在一个文件下载程序中,可以使用多线程同时下载多个文件。需要注意的是,在某些情况下,多线程并不一定能提高程序的性能,因为线程的创建和管理也需要一定的时间和资源开销。因此,在使用多线程编程时,需要根据实际情况进行评估和优化。

  1. 注意事项

在多线程编程中,需要注意以下几点:

  • 避免共享数据:在使用多线程编程时,应该尽量避免共享数据,以避免出现数据竞争或冲突的问题。如果必须要共享数据,应该使用同步机制来确保同一时间只有一个线程可以访问共享数据。
  • 注意线程的生命周期:每个线程都有自己的生命周期,包括创建、启动、运行和结束等阶段。在程序中管理好线程的生命周期,避免出现死锁或其他问题。
  • 慎用全局变量:在多线程编程中,全局变量可能会导致线程不安全。如果必须要使用全局变量,应该使用同步机制来保护全局变量的访问。
  • 选择合适的同步机制:在多线程编程中,选择合适的同步机制非常重要。例如,可以使用互斥锁(mutex)或条件变量(condition variable)等同步机制来确保数据的正确性和一致性。

总之,Python的多线程编程可以让程序实现并发执行多个子任务的目标,从而提高程序的性能和响应速度。但是在使用多线程编程时,需要注意线程安全和线程同步的问题,以及选择合适的同步机制来保护共享数据的访问。


全部16步学习完成 ,后续就是介绍项目实战,请大家给予点赞、关注,绝对超值!



附录

“练一练”参考答案

第1步
答案:(略)

第2步
1 答案:BCDF
2 答案:BC
3 答案:√
4 答案:(略)

第3步
1 答案:ABCD
2 答案:1)×2)√
3 答案:(略)

第4步
1 答案:BD
2 答案:BC
3 答案:CD
4 答案:B

第5步
1 答案:(略)
2 答案:B
3 答案:D

第6步
答案:1)×2)√ 3)√ 4)×

第7步
1 答案:B
2 答案:D
3 答案:AD
4 答案:1)√ 2)×3)√ 4)√

第8步
1 答案:AB
2 答案:ABC
3 答案:global
4 答案:1)√ 2)√

第9步
1 答案:ABCD
2答案:1)√2)√3)√4)√5)×6)√7)×8)×
3 答案:(略)

第10步
1 参考答案:AttributeError、OSError、IndexError、KeyError、NameError、TypeError和ValueError等。
2 答案:B
3 答案:1)√ 2)√ 3)√ 4)×5)×

第11步
1 答案:1)-2 2)-1
2答案:1)√2)√3)×4)√5)×

第12步
1 答案:(略)
2答案:1)×2)√3)√4)√5)×6)×7)√8)√

第13步
1 答案:(略)
2 答案:1)√ 2)×

第14步
1 答案:(略)
2 答案:(略)
3答案:1)√2)√3)√4)√5)×6)√7)√8)√

第15步
1 答案:(略)
2 答案:BCD
3答案:1)√2)√3)√4)√5)×6)×7)√8)√

第16步
1 答案:(略)
2 答案:(略)
3 答案:AB
4答案:1)√2)√3)×4)×

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1012685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ant-design-vue】ant-design-vue在uniapp使用时,auto-import失败报错

前言 在我的 uniapp vue3 vite 项目中,使用了 ant-design-vue 4.x 组件库,同时我还使用了 vite 插件 auto-import 用于自动导入vue3的组合式api。当我全局引用antd-vue时,开发模式下可以正常运行,却不能 npm run build 正常打包…

港联证券:“保险+期货”快速落地生花 涉及品种累计达18个

从普洱火车站出发,乘车3小时40分钟,经过250公里山路之后,能够到达云南西南边境的孟连县。孟连县全称孟连傣族拉祜族佤族自治县,“孟连”音自傣语,意为“寻找到的好地方”。这里属亚热带气候,热区资源丰富&a…

与社交媒体结合:视频直播美颜sdk在社交平台上的应用

为了让直播内容更吸引人,视频直播美颜sdk(Software Development Kit)正逐渐崭露头角,为社交媒体用户提供了卓越的美颜效果和互动体验。 一、什么是视频直播美颜sdk? 在深入讨论如何将视频直播美颜sdk整合到社交媒体平…

vue2 项目中嵌入视频

案例&#xff1a; 代码&#xff1a; <template><div class"schematicDiagramIndex"><el-container><el-aside width"20rem"><!-- <h4 style"font-size: 18px">视频演示</h4>--><div style…

低代码平台:通过可视化的开发工具和组件库,可快速地构建应用程序,从而实现快速迭代和升级

概述&#xff1a; 低代码是一种新兴的应用程序开发方式&#xff0c;无需编码或通过少量代码就可以快速生成应用程序的开发平台。通过可视化的开发工具和组件库&#xff0c;使得开发人员可以快速地构建应用程序&#xff0c;从而实现快速迭代和升级。 低代码平台的出现是为了解…

Centos 7.4 系统,使用wireshark 抓包,获取数据包来源IP(生产环境测试可用)

1 安装wireshark yum install wireshark &#xff08;也可以使用rpm包安装&#xff0c;但是依赖包较多&#xff0c;安装可能需要多一点时间&#xff09; 2 安装完后&#xff0c;抓取数据包 tshark -i ens192 -Y "ip.dst 192.168.120.59 and tcp.dstport 4006 and fra…

微信小程序Snapshot导出海报

开启skyline app.json "lazyCodeLoading": "requiredComponents","renderer": "skyline","componentFramework": "glass-easel","rendererOptions": {"skyline": {"defaultDisplayBlo…

cuda以及pytorch安装

安装CUDA显卡驱动 这篇博客已经超级详细&#xff0c;具体就不在闭门造车了&#xff01; 最简单、实用的cuda安装教程&#xff01;&#xff01;&#xff01;&#xff08;nvidia官方渠道下载&#xff09; 检测CUDA版本&#xff08;cmd窗口命令行下&#xff09; nvidia-sminvcc…

MySQL 用户账号管理(Accounts Management)

用户需要通过账号连接到MySQL Server&#xff0c;本文总结了MySQL账号的常用管理操作。 目录 一、用户账号简介 二、账号创建 三、账号权限管理 3.1 权限赋予与回收 3.1.1 库级赋权 3.1.2 表级赋权 3.1.3 列级赋权 3.1.4 存储过程和函数赋权 3.1.5 权限查询 3.1.6 权限回收 3.2…

SpringMVC自定义注解---[详细介绍]

一&#xff0c;对于SpringMVC自定义注解概念 是一种特殊的 Java 注解&#xff0c;它允许开发者在代码中添加自定义的元数据&#xff0c;并且可以在运行时使用反射机制来获取和处理这些信息。在 Spring MVC 中&#xff0c;自定义注解通常用于定义控制器、请求处理方法、参数或者…

Linux CentOS7系统运行级别

运行级别就是Linux操作系统当前正在运行的功能级别。在早期系统设置中&#xff0c;共设有七个运行级别&#xff0c;编号从0到6。系统可以引导到任何给定的运行级别。 每个运行级别指定不同的系统配置&#xff0c;并允许访问不同的进程组合。默认情况下&#xff0c;Linux会引导…

[C++ 网络协议] 多种I/O函数

1. Linux的send&recv函数 1.1 send函数和recv函数 #include <sys/socket.h> ssize_t send( int sockfd, //套接字文件描述符 const void* buf, //保存待传输数据的缓冲地址值 size_t nbytes, //待传输的字节数 int flags …

Layui快速入门之第六节 选项卡

目录 一&#xff1a;基本概念 选项卡依赖element模块 API 元素属性 基本使用&#xff1a; 二&#xff1a;选项卡风格 默认风格 简约风格 ​编辑 卡片风格 三&#xff1a;hash 状态匹配 四&#xff1a;tab相关操作 渲染 tab 添加 tab 删除 tab 切换 tab 自定义…

华为云云耀云服务器L实例评测 | 基于docker部署nacos2.2.3服务

#【有奖征文】华为云云服务器焕新上线&#xff0c;快来亲身感受评测吧&#xff01;# &#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&…

C++之哈希表、哈希桶的实现

哈希表、哈希桶的实现 哈希概念哈希冲突哈希函数哈希冲突解决闭散列哈希表闭散列实现哈希表的结构哈希表的插入哈希表的查找哈希表的删除 开散列开散列概念哈希表的结构哈希表的插入哈希表的查找哈希表的删除 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置…

Postman使用_Tests Script(断言测试)

断言测试可以在Collection、Folder和Request的 pre-request script 和 test script中编写&#xff0c;测试脚本可以检测请求响应的各个方面&#xff0c;包括正文、状态代码、头、cookie、响应时间等&#xff0c;只有测试符合自定义的要求后才能通过。 pm对象提供了测试相关功能…

LiveNVR监控流媒体Onvif/RTSP功能-支持海康摄像头海康NVR通过EHOME协议ISUP协议接入分发视频流或是转GB28181

LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…

SadTalker 让图片说话

参考&#xff1a;https://github.com/OpenTalker/SadTalker 其他类似参考&#xff1a;https://www.d-id.com/ 输入图片加音频产生2d视频 安装使用 1、拉取github&#xff0c;下载对应安装库 2、下载对应模型baidu网盘 新建checkpoints&#xff0c;把下载sadtalker里模型拷贝进…

Docker 的使用

一、Docker 的作用和优势 软件集装箱化平台&#xff0c;可让开发者构建应用程序时&#xff0c;将它与环境一起打包到一个容器中&#xff0c;发布应用到任意平台中。 能在单台机器上运行多个Docker微容器&#xff0c;而每个微容器里都有一个微服务或独立应用&#xff0c; 如&am…

汽车行业新闻稿怎么写?怎么写关于汽车的新闻稿?

撰写汽车行业新闻稿需要遵循一定的结构和要点&#xff0c;以确保内容准确、清晰&#xff0c;并能吸引读者的兴趣。以下是关于汽车的新闻稿的一些写作要点和建议&#xff0c;接下来伯乐网络传媒就来给大家分享一下&#xff1a; 标题醒目&#xff1a;新闻稿的标题应该简洁明了&am…